2.请解释以下keywords的区别: assign vs weak, block vs weak
assign适用于基本数据类型,weak是适用于NSObject对象,并且是一个弱引用。
assign其实也可以用来修饰对象,那么我们为什么不用它呢?因为被assign修饰的对象在释放之后,指针的地址还是存在的,也就是说指针并没有被置为nil。如果在后续的内存分配中,刚好分到了这块地址,程序就会崩溃掉。
而weak修饰的对象在释放之后,指针地址会被置为nil。所以现在一般弱引用就是用weak。
weak的常见场景是在 delegate,block,NSTimer中使用,以避免循环引用所带来的内存泄漏,这是教科书式的用法。
编程语言是工具,语言特性只是工具的特性,工具怎么用在于使用者。weak 关键字的方便之处绝不局限于避免循环引用,适当脑洞,可以在其他场景下带来一些有趣的应用。
weak的用处用一句话可归纳为:弱引用,在对象释放后置为 nil,避免错误的内存访问。用更通俗的话来表述是:weak 可以在不增加对象的引用计数的同时,又使得指针的访问是安全的。
首先block是用来修饰一个变量,这个变量就可以在block中被修改(参考block实现原理) block:使用block修饰的变量在block代码快中会被retain(ARC下,MRC下不会retain) weak:使用weak修饰的变量不会在block代码块中被retain
同时,在ARC下,要避免block出现循环引用 weaktypedof(self)weakSelf = self;