观察者 和 block的区别

来源:互联网 发布:卖鸽子的软件 编辑:程序博客网 时间:2024/06/06 15:38
通知中心
消息————注册观察者————监听有没有消息发出----------作出响应


步骤:
1.  注册观察者
2.发送消息
3.移除
KVO
使用方法:
1.
- (void)viewDidLoad {
    [superviewDidLoad];
   
//注册观察者
    [[
NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(changeColor:)name:@"change"object:nil];
   
self.navigationItem.leftBarButtonItem= [[UIBarButtonItemalloc]initWithTitle:@"跳转"style:UIBarButtonItemStylePlaintarget:selfaction:@selector(skip:)];
}
//改变背景颜色
- (
void)changeColor:(NSNotification*)notify {
   
UIColor *color = [notifyobject];
   
self.view.backgroundColor= color;
//    self.view.backgroundColor = notify.object;
}
2.
- (void)viewWillDisappear:(BOOL)animated {
   UIColor*color = [UIColorcolorWithRed:arc4random() % 256/ 255.0 green:arc4random() %256 / 255.0blue:arc4random() % 256/ 255.0 alpha:1.0];
   
//发送消息
    [[NSNotificationCenterdefaultCenter]postNotificationName:@"change"object:color];
}
3.
- (void)dealloc {
   
//3.移除观察者
    [[
NSNotificationCenterdefaultCenter]removeObserver:selfname:@"change"object:nil];
    [
superdealloc];
   
}




Block


.h
//返回值(名字)(将来要传的参数)
//1.重命名Block
typedefvoid(^passColor)(UIColor*color);

@interfaceSecondViewController : UIViewController
//2.创建一个Block对象
//copy:是因为刚开始并不执行,拷贝复制一份,放在一个地方,当需要的时候才会开始执行
@property(nonatomic,copy)passColorcolor;
//3.创建方法从外界传入一个Block
- (
void)getBlockFromOutSpace:(passColor)color;



.m
- (void)getBlockFromOutSpace:(passColor)color {
   
//初始化Block对象
   
//遵循原则:谁创建,谁调用谁想用,谁负责实现
   self.color = color;
}
- (void)viewWillDisappear:(BOOL)animated {
   UIColor *color = [UIColorcolorWithRed:arc4random() %256 / 255.0 green:arc4random() %256 / 255.0 blue:arc4random() %256 / 255.0 alpha:1.0];
   if (self.color) {
       
//调用Block  函数名()实参
       self.color(color);
    }
}


.m
   __blockRootViewController*root = self;
   //此时secondroot就是弱引用,
   //防止循环调用,导致的空间不能被释放掉,内存泄露,
    [secondVCgetBlockFromOutSpace:^(UIColor *color) {
        root.view.backgroundColor = color;
    }];
0 0
原创粉丝点击