最近遇到和看到的一些面试题。

请解释 assign 与 weak 的区别, block 与 weak 的区别

assign适用于基本数据类型,weak是适用于NSObject对象,并且是一个弱引用。

assign其实也可以用来修饰对象,那么我们为什么不用它呢?因为被assign修饰的对象在释放之后,指针的地址还是存在的,也就是说指针并没有被置为nil。如果在后续的内存分配中,刚好分到了这块地址,程序就会崩溃掉。而weak修饰的对象在释放之后,指针地址会被置为nil。所以现在一般弱引用就是用weak。

首先__block是用来修饰一个变量,这个变量就可以在block中被修改(参考block实现原理)。

  • 使用__block修饰的变量在block代码快中会被retain(ARC下,MRC下不会retain)
  • 使用weak修饰的变量不会在block代码块中被retain

同时,在ARC下,要避免block出现循环引用 weak typedof(self)weakSelf = self;