__block和__weak的作用及区别

两者之间的区别:

__block不管是ARC还是MRC模式下都可以使用,而__weak只能在ARC模式下使用。

__block可以修饰对象和基本数据类型。 __weak只能修饰对象。

__block对象可以在block中被重新赋值,__weak不可以被重新赋值。 

当用__block和__weak分别修饰一个对象,__block会持有该对象,即使超出了该对象的作用域,该对象还是会存在的,直到block对象从堆上销毁;而__weak仅仅是将该对象赋值给weak对象,当该对象销毁时,weak对象将指向nil;


在block中防止循环引用需要注意的问题:

__block本身不能避免循环引用,如要避免要在block中把 __block修饰的对象置为nil。另外需要注意在MRC模式下__block是不会引起retain;但是在ARC模式下__block则会引起retain。所以ARC中建议使用__weak。

__weak可以避免循环引用,但是会导致外部对象释放后,block内部也访问不到该对象,可以通过在block内部声明一个__strong的变量,使其指向 weakObj,这样外部对象既可以在 block 内部保持住,又可以避免循环引用的问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容