观察者 和 block的区别

通知中心
消息————注册观察者————监听有没有消息发出----------作出响应


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




Block

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

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


.m
- ( void )getBlockFromOutSpace:( passColor )color {
   
// 初始化 Block 对象
   
// 遵循原则 : 谁创建 , 谁调用 谁想用 , 谁负责实现
    self.color = color;
}
- ( void )viewWillDisappear:( BOOL )animated {
    UIColor *color = [UIColor colorWithRed: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
    __block RootViewController *root = self ;
    // 此时 second root 就是弱引用 ,
    // 防止循环调用 , 导致的空间不能被释放掉 , 内存泄露 ,
    [secondVC getBlockFromOutSpace:^(UIColor *color) {
        root.view.backgroundColor = color;
    }];

你可能感兴趣的:(观察者 和 block的区别)