iOS面试题:下面keywords的区别: assign vs weak, __block vs __weak

153 阅读1分钟

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修饰符的对象,作用等同于定义为weakproperty。自然不会导致循环引用问题,因为苹果文档已经说的很清楚,当原对象没有任何强引用的时候,弱引用指针也会被设置为nil。

  • __weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。