【发布时间】:2012-10-03 09:24:12
【问题描述】:
我有几个问题。
1)assign 属性会占用内存,因为我们不需要释放以减少引用计数?
2)自动归零参考和非自动归零参考有什么区别?它是如何工作的?将如何占用内存?
【问题讨论】:
我有几个问题。
1)assign 属性会占用内存,因为我们不需要释放以减少引用计数?
2)自动归零参考和非自动归零参考有什么区别?它是如何工作的?将如何占用内存?
【问题讨论】:
weak 适用于对象(它们具有引用计数和所有内容),但弱引用不会增加引用计数。但是一旦对象被释放(从代码中的任何地方),对该对象的任何弱引用都会设置为nil。这非常有用,因为如果你只使用强引用和弱引用,你就不能得到一个无效的指针(指向一个已经被释放的对象的指针)。
assign 对引用绝对没有任何作用,它通常用于整数、浮点数和其他非对象类型。你当然可以为这样的变量分配一个对象引用,但是如果对象被释放,你仍然会有一个指向它的内存的指针(这现在是垃圾,当你使用它时会伤害你)。
您对“内存使用”的担忧很奇怪——引用不占用内存,对象占用。但是如果你要使用一个对象,你就不能释放它。初学者的简单规则是:对于对象,尽可能使用强引用。当您有理由不使用强引用时,请使用弱引用(通常用于委托和数据源)。对于原始类型(int、float、CGRect、...),请使用 assign,因为它们不是对象。
【讨论】:
assign 不允许用于 ARC 下的对象引用。如果你想要同样的行为,你必须使用__unsafe_unretained,它做同样的事情,但故意听起来更可怕。
assign 类似于weak,但是当它离开堆时指针没有归零。所以,它不如weak 安全。
【讨论】: