__weak和__block

一、修饰类型区别
  • 1、__weak只能在ARC模式下使用,也只能修饰对象(如:NSString),不能修饰基本数据类型(int)
  • 2、__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型
二、循环引用的问题
  • 1、__weak 本身是可以避免循环引用的问题的,但是其会导致外部对象释放了之后,block 内部也访问不到这个对象的问题,我们可以通过在 block 内部声明一个 __strong 的变量来指向 weakObj,使外部对象既能在 block 内部保持住,又能避免循环引用的问题
  • 2、__block 本身无法避免循环引用的问题,但是我们可以通过在 block 内部手动把 blockObj 赋值为 nil 的方式来避免循环引用的问题
  • 3、__block有一点:这只是限制在ARC环境下。在非arc下,__block是可以避免引用循环的
三、__block与__weak功能上的区别
  • 1、__block对象可以在block中被重新赋值,__weak不可以;__block可以让block修改局部变量,__weak不能
  • 2、 __block 修饰的变量在 block 内外都是唯一的,__block会持有该对象,即使超出了该对象的作用域,该对象还是会存在的,直到block对象从堆上销毁;__weak仅仅是将该对象赋值给weak对象,当该对象销毁时,weak对象将指向nil
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。