OC学习2-通信机制

315 阅读6分钟

一、OC通信机制

(一)、代理

实际开发中的使用场景用于视图,与使用对象之间的交互,其最显著的特点就是它有返回值。

意义:代理的效率最高。

利用协议实现代理模式的主要思路:

1、定义一个协议,里面声明代理类需要实现的方法;

2、创建一个代理类,遵循上面的代理类。

3、设置代理属性,制定协议后需要为委托对象设置一个代理属性,代理属性的作用是存储委托对象的代理对象。@property (nonatomic, weak) id<****> delegate;//****是协议名

4、制定代理对象,通常在代理对象中制定委托对象的代理是自己

.delegate = self;//代理对象名

5、代理对象实现委托协议中必须实现的方法。

6、委托对象在合适的时机让代理对象执行协议中的方法,调用已经实现的协议中的方法

if ([self.delegate respondsToSelector:@selector(方法名)]) {

//如果代理方实现了协议中得方法,就让代理去执行该方法

[self.delegate 方法];

}

代理设计模式的用处

1,可以用来监听,代理可以监听被代理的一些行为并实现相应的方法。

2,可以用来通知,被代理的类发生了一些行为,可以第一时间通知代理。

3,代处理,当被代理对象无法完成某些行为时,可以委托代理来完成。

通过被代理者定义代理协议,然后委托代理者实现协议,主要用于两个对象之间的传值交互,实际用于视图,与使用对象之间的交互。

例子:

要求:学生需要找房源,中介可以提供房源。

【学生类】Person

行为:需要住房

【中介类】Agent

行为:找房

【协议类】findHouse

协议:找房

协议类.h:

定义一个协议,里面声明代理类需要实现的方法;

image1.png  学生类Person.h:

设置代理属性,制定协议后需要为委托对象设置一个代理属性 image.png 学生类Person.m: 制定代理对象,通常在代理对象中制定委托对象的代理是自己 image.png 中介类Agent.h

image.png

中介类Agent.m image.png Main.m文件 image.png

(二)、通知

NSNotification Center通知中心 发布通知 监听通知 概念:NSNotification一个中心对象注册和发送通知,所用的其他对象都可以收到通知。 作用:用来管理通知的接受和发送,一个对象发送通知给通知中心,然后通知中心会将这个通知发送给观察者。 用途:用于在向服务器端请求数据或者提交数据的场景,在和服务器端成功交互后,需要处理服务器端返回的数据,或发送响应消息等。 意义:广播数据,一对多

(三)、block

block概念:

作用:在程序运行的过程中保存一段代码,并且这段代码可以进行传递。

应用:用于对象间的通信。对象与对象之间的通信,一对一

意义:它允许开发者在两个对象之间将任意的语句当做数据进行传递,往往这要比引用定义在别处的函数直观,能够直接存储一个代码块的实现部分,不需要再去定义一个函数

Student.h image.png Student.m image.png Agent.h image.png Agent.m image.png Main.m

image.png

block作为参数传递时用法

方式一、在传参时直接声明block回调方法。

  1. 定义方法:
  • (int)doTest:(NSString *)name para1:(int)temp1 para2:(int)temp2 success:(int (^)(int param1, int param2))success

{

    int ret = success(temp1, temp2);

    NSLog(@"----%@ -- %d--", name, ret);

    return ret;

}

  1. 调用方法:

    [self doTest:@"Tom" para1:8 para2:15 success:^int(int param1, int param2) {   // 调用 doTest的时候,这个红色的block在 doTest 中马上就会调用(见上面蓝色代码)。

        return param1 + param2; 

    } ];

block作为属性:

image.png

image.png block作为方法的参数: image.png

image.png

image.png  

(四)、三者区别

代理:

多人开发中,防止一个类改变导致别的地方也被改变,用对象弟子调用对象的方法, 给对象赋值,代理是委托方声明方法,并调用,代理方实现。通过被代理者定义代理协议,然后委托代理者实现协议,主要用于两个对象之间的传值交互,实际用于视图,与使用对象之间的交互。

 

block:

目的是能够直接存储一个代码块的实现部分,而不需要再去定义一个函数,void(^myblock)()=可以直接跟实现的代码块,就是将函数整体拿过来,把函数名去掉,在前面加一个block标识^.这样在别的代码块中也可以直接调用这个部分。

其实block就是相当于去实现代理,block是委托方声明block方法,并调用,在代理方里面用委托方调用那个block方法, 并且实现,block效率更高。

 

通知:

通知可以群发,而代理和block只能单发,通知就是一方传值,一方接值,把所有的东西传到一个集合里面,可以控制发送给全部还是自己,接受也同样可以控制。

二、视图层次结构

任何应用有且只有一个UIWindow对象,UIWindow对象就是一个容器,负责包含应用中的所有视图,加入窗口的视图会成为该窗口的子视图,窗口的子视图还可以有自己的子视图,从而构成一个以UIWindow对象为根视图的,类似于树形的视图层次结构。

三、UIResponder

在IOS中只有继承了UIResponder的对象才能接受并处理时间,被称为响应者对象,以下都是继承UIResponder,所以能接收并处理时间

    • UIApplication
    • UIViewController
    • UIView

因为它提供了四个对象方法来处理触摸事件,所以能够接收并处理事件

image.png 事件的传递:

触摸事件的传递是从父空间传递到子控件

也就是Application->window->寻找处理事件最合适的view

如何找到最合适的view

1、首先判断主窗口自己是否能接受触摸事件

2、触摸点是否在自己身上

3、从后往前遍历子控件,重复前面的两个步骤

4、如果没有符合条件的子控件,那么就认为自己是最合适处理

hitTest:withEvent:方法

只要事件一传递给一个控件,这个控件就会调用他自己的hitTest:withEvent:方法寻找合适的View

作用:寻找并返回最合适的view

四、UIView

屏幕上能看得见摸得着的东西就是UIView,比如屏幕上的按钮、文字、图片

UIButton、UILabel、UITextField都继承自UIView

每一个UIView都是一个容器,能容纳其他UIView(比如右图中的整个键盘是一个UIView,里面容纳很多小格子的数字UIView)

五、UIViewController

1、每当显示一个新界面时,首先会创建一个新的UIViewController对象,然后创建一个对应的全屏UIView,UIViewController负责管理这个UIView

2、UIViewController就是UIView的大管家,负责创建、显示、销毁UIView,负责监听UIView内部的事件,负责处理UIView与用户的交互

3、UIViewController内部有个UIView属性,就是它负责管理的UIView对象 :

@property(nonatomic,retain) UIView *view;

六、UIView和UIViewController的关系

UIView只负责对数据的展示,采集用户的输入、监听用户的事件等。

其他的操作比如:每个UIView的创建、销毁、用户触发某个事件后的事件处理程序

等这些都交给UIViewController来处理。