iOS代理 通知 block传值的规范写法
最近也不知道写什么好,因为空闲下来就想写点东西,以前写代码没有注意到代理和block的规范,最好是带上当前类,为了提高自己代码的规范,就写了这篇简单的文章
代理
第一步
在被代理者声明一个协议,写出一个方法
代理的规范写法:类名+Delegate
方法的规范写法:类名+(第一个参数是类本身)+(其他参数)
@class FirstView; @protocol FirstViewDelegate <NSObject> @optional - (void)FirstViewbtnClick:(FirstView *)firstView andStr:(NSString *)str; @end
第二步:
再拥有一个代理属性
代理使用weak防止循环引用
使用id 并遵守代理
@property (nonatomic,weak) id <FirstViewDelegate> delegate;
第三步:
在某个事件操作时候,进行查看代理是否遵循代理,如果遵循代理,则让代理相应协议中的方法
if (_delegate &&[_delegate respondsToSelector:@selector(FirstViewbtnClick: andStr:)]) { [_delegate FirstViewbtnClick:self andStr:str]; }
第四步:让代理者遵循协议,并且实现协议方法
@interface ViewController ()<FirstViewDelegate>
//代理 - (void)FirstViewbtnClick:(FirstView *)firstView andStr:(NSString *)str { NSLog(@"%@",str); }
通知
第一步:这里在某个事件被操作时候发出通知,类似于代理中查看代理者是否遵循代理
[[NSNotificationCenter defaultCenter] postNotificationName:@"selectRow" object:nil userInfo:@{@"selectRowKey":_str}];
第二步:接受通知,这里注意那个方法是需要传递参数的
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ssrpickerselectrow:) name:@"selectRow" object:nil];
第三步:实现接受通知的那个方法,注意这里的key要和发出通知的一致。建议最好是写一个单独的类存放这些东西。我这里为了大家都看得懂就不写了。
- (void)noti:(NSNotification *)noti { NSLog(@"%@",noti.object); }
第四步:记得移除通知
- (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; }
Block
类比代理
第一步:声明一个block
typedef void(^Block) (FirstView *firstVC, NSString *str);
第二步:拥有一个block属性
@property (nonatomic,copy) Block block;
第三步:在某个事件操作时候
if (_block) { _block(self, str); }
第四步
self.first.block = ^(FirstView *firstVC, NSString *str) { NSLog(@"%@",str); };
Demo里面把三种方法都写齐全了
代码留给你,喜欢和点赞留给我