两者之间的区别:
__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 内部保持住,又可以避免循环引用的问题。
网友评论