最近接手了一个比较老的项目 使用的是mrc 之前一直没怎么关注这二者的区别 .在我接触mrc之前的理解:__block修饰后的变量在block中可以被改变,___weak修饰防止block循环引用. 其实在MRC下面__weak和__block作用是一样的.也可以用__block修饰防止循环引用. 这是因为MRC下面__block修饰的对象变量在block里不会被retain,但ARC下面就会.
归纳一下,__block和__weak修饰符的区别其实是挺明显的:
1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
3.__block对象可以在block中被重新赋值,__weak不可以。
4.__block对象在ARC下可能会导致循环引用,非ARC下会避免循环引用,__weak只在ARC下使用,可以避免循环引用。
整理如下:__block是强引用类型,__week是弱引用类型。两者相比,__block更加全能,因为它可以在MRC和ARC都可以使用,既能修饰对象又能修饰基本数据类型。但是它还是有缺点,缺点在于在ARC环境下,会引起循环引用。而__week则只能在ARC环境下使用,且只能修饰对象,但是它不会发生循环引用。