弱引用(weak)和赋值属性(assign property)之间的区别是什么?

3

我有几个问题。

1)在哪里分配属性将占用内存,因为我们不需要释放以减少引用计数?

2)自动零引用和非自动零引用之间有什么区别?它是如何工作的?它将占用多少内存?

2个回答

27

weak适用于对象(它们具有引用计数等内容),但弱引用不会增加引用计数。但是一旦对象被释放(从代码的任何位置),指向该对象的任何弱引用都将设置为nil。这非常有用,因为如果只使用强引用和弱引用,则不能得到无效的指针(指向已释放的对象)。

assign对引用不做任何操作,通常用于整数、浮点数和其他非对象类型。当然,您可以将对象引用分配给这样的变量,但如果对象被释放,则仍将拥有指向其内存的指针(该内存现在已成为垃圾,并且在使用时会产生问题)。

您对“内存使用”方面的担忧很奇怪-引用不占用内存,对象才占用内存。但是,如果要继续使用对象,则无法释放对象。初学者的简单规则是:对于对象,尽可能使用强引用。当您有理由不使用强引用时,请使用弱引用(通常用于委托和数据源)。对于原始类型(int、float、CGRect等),请使用分配,因为它们不是对象。


1
你关于“weak”的描述有一个错误。弱引用只有在对象被释放后才会被设置为nil,而不仅仅是被释放。 - rmaddy
1
还要注意,在ARC下,assign不能用于对象引用。如果你想要相同的行为,你必须使用__unsafe_unretained,它做的事情是一样的,但故意听起来更可怕。 - Ben Zotto
虽然答案对弱引用和强引用有清晰的解释,但我仍然不明白为什么要使用assign? - Sukhpreet

8

assignweak 类似,但是当离开堆时没有将指针清零。因此,它不像 weak 那样安全。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接