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];
};
//这样处理之后就不会循环引用