区别
weak只能修饰对象
assign可修饰对象和基本数据类型,修饰对象时,相当于unsafe_unretained
weak不会产生野指针问题。因为weak修饰的对象被释放后(retain count为0),指针会自动被置为nil
assign如果修饰对象,会产生野指针问题。修饰的对象被释放后,指针不会自动置空。
总结
assign适用于基本数据类型,不适用于引用类型。因为值类型会被放入栈中,遵循先进后出的原则,由系统负责管理栈内存。而引用类型会被放入堆中,需要我们自己手动管理内存或通过ARC管理。
weak适用于delegate和block等引用类型,不会导致野指针问题,也不会循环引用,非常安全。
属性关系有两种主要类型:strong和weak,相当于非ARC环境里的retain和assign。只要存在一个强引用,对象就会一直存在,不会被销毁。强引用类似于C++中的shared_ptr,只不过管理引用计数的代码是在编译时生成的,而shared_ptr是在运行时通过操作符重载确定的。
weak属性的变量是不为其所属对象持有的,并且在该变量被销毁之后,此weak变量的值会自动被赋值为nil。
而assign属性一般是对C基本数据类型成员变量的声明,当然也可以用在对象类型成员变量上,只是其代表的意义只是单纯地拷贝所赋值变量的指针。即如果对某assign成员变量B赋值某对象A的指针,则此B只是简单地保存此指针的值,且并不持有对象A,也就意味着如果A被销毁,则B就指向了一个已经被销毁的对象,如果再对其发送消息会引发崩溃。
Objective-C中一直存在循环引用的问题,但在实际应用中很少出现循环引用。对于过去那些使用assign属性的地方,在ARC环境中要使用weak代替。大部分引用循环是由委托(delegate)引起的,所以应该总是把delegate属性声明为weak。当引用的对象被销毁之后,weak引用会被自动置为nil,与assign相比这是一个巨大的进步,因为assign可以指向被释放掉的内存,导致程序崩溃
网友评论