作为一名新的iOS程序员,我今天遇到了一些错误需要修复,其中一些与我使用的是弱属性而不是强类型有关。将每个属性设置为强有什么缺点?
我意识到一个好的程序员不会有这个问题,只会将属性强设为需要,但是,在我的新手眼里,我看不出为什么我应该使用弱点,它只是增加了问题的风险。
作为一名新的iOS程序员,我今天遇到了一些错误需要修复,其中一些与我使用的是弱属性而不是强类型有关。将每个属性设置为强有什么缺点?
我意识到一个好的程序员不会有这个问题,只会将属性强设为需要,但是,在我的新手眼里,我看不出为什么我应该使用弱点,它只是增加了问题的风险。
在一般情况下,你应该决定之间weak
,strong
,assign
,并copy
通过观察类的持有物业和财产的价值,也是一种财产关系的传递。
assign
(或者不使用所有权限定符在所有)strong
NSCopying
协议标量,可变对象,使用copy
strong
NSCopying
协议的可变对象,但所有权保留在调用者身上,使用copy
weak
。所有权的概念在参考计数记忆模型中非常重要。这是决定背后的主要驱动因素。您需要确定对象的主要所有者的位置,并为该所有者提供强有力的参考。如果所有权是由一组对象共享的,那么给它们一个强有力的参考。
最困难的情况是当对象可以直接或间接地彼此拥有。在这种情况下,你最好用“知道”代替“所有权”,给所有对象一个“拥有”每个人的共同“顶级”所有者,并建立与weak
引用的“知道”关系的模型。
这是最好的答案。但澄清一点。对我来说,术语“标量”意味着一个简单的非对象数据类型,它包含一个值,如int,float,char等。对于这些,您使用assign,因为您不管理内存。 –
对于新程序员来说,这是一个糟糕的答案。如果他们不知道他们是否应该保留一个强或弱的参考,他们当然不会知道什么是标量不可变的价值 – davbryn
另一点:还有另一种情况,你没有提到:共享所有权。有时在你的设计中,多个对象都可以拥有对同一个对象的拥有引用。例如,一个绘图程序,可以创建相同功能对象的二维和三维图形。这两种类型的图都需要拥有它们所绘制的公式对象。公式对象可能是可变的,如果用户更改公式,则希望这些更改显示在任何活动图形中,因此复制不是正确的选择。 –
weak
和strong
对于正确地进行内存管理非常重要。
strong
将增加指针的引用计数器,并且您有效地说您拥有该对象。
weak
不会增加引用计数器,并且该对象可能随时消失。如果你有一个循环依赖,你应该使用weak
来避免内存泄漏(两个对象之间有很强的引用是循环依赖,这些对象永远不会被释放)。
你应该总是考虑一下你的记忆管理,但一个很好的经验法则是,该属性应该始终为strong
,除非你确实知道它保留在别处。只要没有循环引用发生,多个对象可以有相同的对象的引用strong
,没有问题。
拇指的一些超级基本规则:
如果你希望对象坚持围绕至少,直到你完成它,去与强
如果你能处理的对象消失没有它伤害你太糟糕(即它是父母创造你可能是漂亮知道但不是超级重要)然后使用弱
如果它不是NSObject(so是int,bool float或其他原始类型)使用指定。
投票重新开放。我认为把这个关闭作为一个重复是不错的:这个问题的中心问题是强与弱的“用法”,而另一个问题的中心问题是强与强的对比。弱。 – dasblinkenlight
@dasblinkenlight这并没有改变这是一个未经过调查的事实。不得以重复方式关闭,而应该“太宽泛”。 – 2013-12-12 21:31:47