1. assign 和 weak的对比
weak是适用于NSObject对象,并且是一个弱引用。如果要修饰基本数据类型,编译器会报错-“Property with ‘weak’ attribute must be of object type”。
assign适用于基本数据类型,assign其实也可以用来修饰对象,当需要修饰对象类型时,MRC时代使用unsafe_unretained。当然,unsafe_unretained也可能产生野指针,所以它名字是"unsafe_”。那么我们为什么不用它呢?因为被assign修饰的对象在释放之后,指针的地址还是存在的,也就是说指针并没有被置为nil。如果在后续的内存分配中,刚好分到了这块地址,程序就会崩溃掉。
2. __block 和 __weak对比
-
首先
__block是用来修饰一个变量,这个变量就可以在block中被修改、重新赋值的。 -
__block对象在block中不会被block强引用一次,从而不会出现循环引用问题。 -
__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。 -
__block对象可以在block中被重新赋值,__weak不可以。 -
使用了
__weak修饰符的对象,作用等同于定义为weak的property。自然不会导致循环引用问题,因为苹果文档已经说的很清楚,当原对象没有任何强引用的时候,弱引用指针也会被设置为nil。 -
__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。