block语法

block是一个匿名的函数代码块,此代码块可以作为参数传递给其他对象。主要作用是实现两个对象之间相互通信。

block,代理,通知三者都可以实现对象之间相互通信。

delegate与block⼀一般是⽤用于两个对象1对1之间的通信交互,delegate需要定义协议⽅方法,代理对象实现协议⽅方法,并且需要建⽴立代理关系才可以实现通信。block更加简洁,不需要定 义繁琐的协议⽅方法,但是如果通信事件⽐比较多的话,建议使⽤用delegate。Notification主要⽤用于1对多情况下通信,而且,通信对象之家不需要建⽴立关系!但是使⽤用通知,代码可读性差! 


block与变量

引用局部变量:

block直接引用局部变量时,该变量会作为常量编码到block中。

局部变量需要使用__block修饰,才能在block代码块中使用。

全局变量:

static修饰的全局变量可以被修改。

其他情况下全局变量的指是不能被修改的。

block内存管理

在block里面引用一个局部的OC对象时,该对象会被retain。

如果局部变量使用__block修饰,则不会被retain。

在block中引用一个实例变量时,该实例对象会被retain

block可以被copy,release。当block创建的时候内存是被分配到栈上的,当block被copy之后内存从栈移到堆上。

block是全局变量时要调用copy,防止block在栈上被释放掉。

使用block要防止循环引用,当block引用实例变量或方法时就会retain实例对象,实例对象中又调用block就会产生循环引用。循环引用,不要在block内访问实例变量或方法。而是通过__block

修饰的局部变量来间接访问。

例如

self.myblock = ^{
            [self doSomething];
        };
//这种就会循环引用

__block ViewController *weakSelf = self;
        self.myblock = ^{
 
            [weakSelf doSomething];
        };
//这样处理之后就不会循环引用


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值