一、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:
定义一个协议,里面声明代理类需要实现的方法;
学生类Person.h:
设置代理属性,制定协议后需要为委托对象设置一个代理属性
学生类Person.m:
制定代理对象,通常在代理对象中制定委托对象的代理是自己
中介类Agent.h
中介类Agent.m
Main.m文件
(二)、通知
NSNotification Center通知中心 发布通知 监听通知 概念:NSNotification一个中心对象注册和发送通知,所用的其他对象都可以收到通知。 作用:用来管理通知的接受和发送,一个对象发送通知给通知中心,然后通知中心会将这个通知发送给观察者。 用途:用于在向服务器端请求数据或者提交数据的场景,在和服务器端成功交互后,需要处理服务器端返回的数据,或发送响应消息等。 意义:广播数据,一对多
(三)、block
block概念:
作用:在程序运行的过程中保存一段代码,并且这段代码可以进行传递。
应用:用于对象间的通信。对象与对象之间的通信,一对一
意义:它允许开发者在两个对象之间将任意的语句当做数据进行传递,往往这要比引用定义在别处的函数直观,能够直接存储一个代码块的实现部分,不需要再去定义一个函数
Student.h
Student.m
Agent.h
Agent.m
Main.m
block作为参数传递时用法
方式一、在传参时直接声明block回调方法。
- 定义方法:
- (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;
}
- 调用方法:
[self doTest:@"Tom" para1:8 para2:15 success:^int(int param1, int param2) { // 调用 doTest的时候,这个红色的block在 doTest 中马上就会调用(见上面蓝色代码)。
return param1 + param2;
} ];
block作为属性:
block作为方法的参数:
(四)、三者区别
代理:
多人开发中,防止一个类改变导致别的地方也被改变,用对象弟子调用对象的方法, 给对象赋值,代理是委托方声明方法,并调用,代理方实现。通过被代理者定义代理协议,然后委托代理者实现协议,主要用于两个对象之间的传值交互,实际用于视图,与使用对象之间的交互。
block:
目的是能够直接存储一个代码块的实现部分,而不需要再去定义一个函数,void(^myblock)()=可以直接跟实现的代码块,就是将函数整体拿过来,把函数名去掉,在前面加一个block标识^.这样在别的代码块中也可以直接调用这个部分。
其实block就是相当于去实现代理,block是委托方声明block方法,并调用,在代理方里面用委托方调用那个block方法, 并且实现,block效率更高。
通知:
通知可以群发,而代理和block只能单发,通知就是一方传值,一方接值,把所有的东西传到一个集合里面,可以控制发送给全部还是自己,接受也同样可以控制。
二、视图层次结构
任何应用有且只有一个UIWindow对象,UIWindow对象就是一个容器,负责包含应用中的所有视图,加入窗口的视图会成为该窗口的子视图,窗口的子视图还可以有自己的子视图,从而构成一个以UIWindow对象为根视图的,类似于树形的视图层次结构。
三、UIResponder
在IOS中只有继承了UIResponder的对象才能接受并处理时间,被称为响应者对象,以下都是继承UIResponder,所以能接收并处理时间
-
- UIApplication
- UIViewController
- UIView
因为它提供了四个对象方法来处理触摸事件,所以能够接收并处理事件
事件的传递:
触摸事件的传递是从父空间传递到子控件
也就是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来处理。