__block 和__ weak 的区别

1:在 block 下循环引用的问题.
○ __block 本身并不能避免循环引用,避免循环引用需要在block内部把__block的obj置位nil。
○__weak则可以避免循环引用的出现,但是其会导致外部对象释放了之后,block 内部也访问不到这个对象的问题。如果要避免循环引用问题,则可以在block内部声明一个__strong的变量来指向weakObj,使外部对象能在block内部保持住。
2:__block和__weak在功能上的区别。
○ __block会持有该对象,即使超出了该对象的作用域,该对象还是会存在的,直到block对象从堆上销毁;而__weak仅仅是将该对象赋值给weak对象,当该对象销毁时,weak对象将指向nil;
○ __block可以让block修改局部变量,而__weak不能。
另外,在MRC中__block是不会引起retain,而在ARC中则会引起retain,所以在ARC中应该使用__weak。

因此,__block和__weak修饰符的区别其实是比较明显的:
1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型int。
3.__block对象可以在block中被重新赋值,__weak则不可以。
4.__block对象在ARC下可能会导致循环引用,非ARC下会避免循环引用,__weak只在ARC下使用,可以避免循环引用。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容