在ARC下,assign和weak的区别

时间:2021-06-24 13:23:48

用了很久,却不知道它俩究竟有什么区别,作为一个新手来说,光会用不行,还要懂得原理。

首先说说区别:weak只可以修饰对象                    assign既可以修饰对象也可以修饰基本数据类型,如int、double和NSIntegerdeng 。

weak不会产生野指针问题               assign可能导致野指针问题,导致程序崩溃。

下面我们说说原因:weak弱引用,所引用对象的计数器不会加一,对象被释放时指针自动被置为nil,避免了循环引用。 assign虽说也可以修饰对象,但是对象被释放时指针并没有被清空,也就是指针没有被置为nil,所以会出现野指针的情况,造成程序奔溃。weak是绝对不可以修饰基本数据类型的,会直接报错。

还有一个前段时间网上热议的问题:@property (nonatomic, weak) id<SomethingDdelegate> delegate;

@property (nonatomic, assign) id<SomethingDdelegate> delegate;  到底是使用weak还是assign呢。在网上已经有人给出验证了(http://www.cnblogs.com/jiackyan/p/4675506.html)结论是weak。

值得一说的是:weak不仅适用于代理,还适用于block。而且非常安全。