常规实现
代理协议
1. 协议:声明一个Protocol,协议里声明方法;
2.产生事件的类:有一个代理属性delegate
id<Protocal>_delegate;
3. 实现事件的类:实现Protocol里的方法;
Block
1 基本概念
1. block是匿名函数代码块,block声明就是传值,代码块并没有被运行,block回调的时候代码块才被执行
2. block里的代码块修改block外面的变量,需要在变量前加上关键字__block,如果进行block操作,外面的变量值也会变化
2 语法
(1) 重命名相同返回值类型,相同参数类型的Block
typedef 返回值类型(^Block名字)(参数类型1,参数类型2...)
(2) block的赋值
Block = ^(参数类型1,参数类型2,...){
... ...
}
(3) 遍历数组
- (void)enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL *_Nonnullstop) {
}
(4) 遍历字典
- (void)enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
}
观察者
1 基本概念
1. 代码写在响应事件的类里,并且该类应有产生事件的类属性
2. 观察者可以实时响应数据的改变
3. 观察者要手动释放,覆写dealloc调用removeObserver
2增加观察者
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:nil;
1. 产生事件的类属性调用:_child
2. addObserver:self---苹果已经在内部定义好观察者,只需在此传入响应事件对象
3. forKeyPath:观察的产生事件的属性
4. options:传递给接收者的值的类型,旧的还是新的
5. context:可为空,nil
3 覆写观察者响应
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:( NSDictionary *)change context:nil;
1. object:观察的对象,即产生事件的对象,可以用类型强转
2. keypath:如果有多个观察者,可以用if判断keypath == 关键属性执行相应操作
3. change:字典,里面包含了观察属性的值,新的,旧的,属性的值可以通过change[@"new"]、change[@"old"]来获取
4. context:可为空,nil
4 释放观察者
- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;
1. 在增加观察者的类里覆写
2. 此类应有产生事件的类的属性, _child调用
3. observer:self
4. keypath:观察的属性@""
通知
1 发出一个通知
[NSNotificationCenter defaultCenter] postNotificationName:(NSString *)aName object:self;
[NSNotificationCenter defaultCenter] postNotificationName:(NSString *)aName object:self userInfo:(nullable NSDictionary *)aUserInfo;
1. 两者都可以发出一个通知,后者可以传入一个用户信息的字典
2. postNotificationName:发出通知的名字
3. object:self
2 接受一个通知
[NSNotificationCenter defaultCenter] addObserver:self selector:(SEL)aSelector name:(nullable NSString *)aName object:nil;
1. 注册一个通知观察者,观察名字为"aNAme"的通知
2. addObserver:在这里就是self
3. selector:接到通知后调用的方法
4. name:指定接收通知的名字
5. object:指定接收某个对象的通知,可为nil
3 移除通知观察者
- (void)dealloc {
[NSNotificationCenter defaultCenter] removeObserver:self name:(nullable NSString *)aName object:nil;
}
1. 在dealloc覆写里移除
2. removeObserver:添加的观察者,即self
3. name:观察的通知的名字
4. object:可为空,nil