ARC下assign和weak区别
assign 和 weak 非常相像,都不对引用计数加1。assign其实也可以修饰对象,但一般不这么做,为什么呢? 下面介绍下两者区别。
这两者主要区别就是weak比assign多了一个功能。当weak修饰的property指向的对象被释放时,该property会自动被置为nil,这样给该property发送任何消息都不会报错。而assign修饰的property指向的对象如果被释放,该property并不会自动被置为nil,这时如果该property指向的内存里结构发生变化,然后又向该property发送消息,那么就会造成野指针操作,导致app崩溃。
还是举个例子解释下。(代码来源网上)
1 | // |
上面代码注释打开后,运行程序有时会崩溃(assignPoint指向的内存结构已经发生变化),有时不会(assignPoint指向的内存结构还没发生变化)。
总结
- 修饰基础数据结构时用assign
- 修饰弱引用的指针还是用weak
PS:
IOS开发中ARC下的assign和weak区别
What’s the difference between ‘weak’ and ‘assign’ in delegate property declaration