观察者 和 block的区别

本文介绍了iOS中观察者(NSNotification)和Block两种不同的事件传递方式。通过实例展示了如何使用NSNotification进行注册、发送和移除观察者,以及Block的声明、赋值和调用。对比了两者在内存管理、代码简洁性和灵活性上的差异。
摘要由CSDN通过智能技术生成
通知中心
消息————注册观察者————监听有没有消息发出----------作出响应


步骤:
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;
    }];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值