我有几个问题。
1)在哪里分配属性将占用内存,因为我们不需要释放以减少引用计数?
2)自动零引用和非自动零引用之间有什么区别?它是如何工作的?它将占用多少内存?
weak适用于对象(它们具有引用计数等内容),但弱引用不会增加引用计数。但是一旦对象被释放(从代码的任何位置),指向该对象的任何弱引用都将设置为nil
。这非常有用,因为如果只使用强引用和弱引用,则不能得到无效的指针(指向已释放的对象)。
assign对引用不做任何操作,通常用于整数、浮点数和其他非对象类型。当然,您可以将对象引用分配给这样的变量,但如果对象被释放,则仍将拥有指向其内存的指针(该内存现在已成为垃圾,并且在使用时会产生问题)。
您对“内存使用”方面的担忧很奇怪-引用不占用内存,对象才占用内存。但是,如果要继续使用对象,则无法释放对象。初学者的简单规则是:对于对象,尽可能使用强引用。当您有理由不使用强引用时,请使用弱引用(通常用于委托和数据源)。对于原始类型(int、float、CGRect等),请使用分配,因为它们不是对象。
assign
跟 weak
类似,但是当离开堆时没有将指针清零。因此,它不像 weak
那样安全。
assign
不能用于对象引用。如果你想要相同的行为,你必须使用__unsafe_unretained
,它做的事情是一样的,但故意听起来更可怕。 - Ben Zotto