2013-12-12 32 views
5

作为一名新的iOS程序员,我今天遇到了一些错误需要修复,其中一些与我使用的是弱属性而不是强类型有关。将每个属性设置为强有什么缺点?

我意识到一个好的程序员不会有这个问题,只会将属性强设为需要,但是,在我的新手眼里,我看不出为什么我应该使用弱点,它只是增加了问题的风险。

+4

投票重新开放。我认为把这个关闭作为一个重复是不错的:这个问题的中心问题是强与弱的“用法”,而另一个问题的中心问题是强与强的对比。弱。 – dasblinkenlight

+0

@dasblinkenlight这并没有改变这是一个未经过调查的事实。不得以重复方式关闭,而应该“太宽泛”。 – 2013-12-12 21:31:47

回答

7

在一般情况下,你应该决定之间weakstrongassign,并copy通过观察类的持有物业和财产的价值,也是一种财产关系的传递。

  • 如果正在设置的属性是原始的,使用assign(或者不使用所有权限定符在所有)
  • 如果正在设置的属性是一个标量,不可变的对象,使用strong
  • 如果属性是一套是实现NSCopying协议标量,可变对象,使用copy
  • 如果正在设置的属性是可变的,而所有权转移给你的对象,请使用strong
  • 如果正在设置的属性是一个实现NSCopying协议的可变对象,但所有权保留在调用者身上,使用copy
  • 如果正在设置的属性是反向引用(即,一个“子”对象中的“父”属性),请使用weak

所有权的概念在参考计数记忆模型中非常重要。这是决定背后的主要驱动因素。您需要确定对象的主要所有者的位置,并为该所有者提供强有力的参考。如果所有权是由一组对象共享的,那么给它们一个强有力的参考。

最困难的情况是当对象可以直接或间接地彼此拥有。在这种情况下,你最好用“知道”代替“所有权”,给所有对象一个“拥有”每个人的共同“顶级”所有者,并建立与weak引用的“知道”关系的模型。

+2

这是最好的答案。但澄清一点。对我来说,术语“标量”意味着一个简单的非对象数据类型,它包含一个值,如int,float,char等。对于这些,您使用assign,因为您不管理内存。 –

+2

对于新程序员来说,这是一个糟糕的答案。如果他们不知道他们是否应该保留一个强或弱的参考,他们当然不会知道什么是标量不可变的价值 – davbryn

+1

另一点:还有另一种情况,你没有提到:共享所有权。有时在你的设计中,多个对象都可以拥有对同一个对象的拥有引用。例如,一个绘图程序,可以创建相同功能对象的二维和三维图形。这两种类型的图都需要拥有它们所绘制的公式对象。公式对象可能是可变的,如果用户更改公式,则希望这些更改显示在任何活动图形中,因此复制不是正确的选择。 –

-3

我使用的经验法则是:如果对象被保留在其他地方,则使用弱。对我来说最重要的是使用界面构建器。如果你有一个IBOutlet,你可以使它变弱,因为这个对象在界面生成器和XIB文件中被处理。

+1

你的经验法则是一个非常糟糕的主意。如果需要保持对象的话,应该有一个强有力的参考。通常不做任何其他决定是否有强有力的参考。 – rmaddy

+0

-1不要依赖其他对象来为您做记忆管理。 – Caleb

+0

这实际上在OS X中大部分都是如此,但绝对不适用于会员资格稍有转变的iOS。 –

1

weakstrong对于正确地进行内存管理非常重要。

strong将增加指针的引用计数器,并且您有效地说您拥有该对象。

weak不会增加引用计数器,并且该对象可能随时消失。如果你有一个循环依赖,你应该使用weak来避免内存泄漏(两个对象之间有很强的引用是循环依赖,这些对象永远不会被释放)。

你应该总是考虑一下你的记忆管理,但一个很好的经验法则是,该属性应该始终为strong,除非你确实知道它保留在别处。只要没有循环引用发生,多个对象可以有相同的对象的引用strong,没有问题。

1

拇指的一些超级基本规则:

如果你希望对象坚持围绕至少,直到你完成它,去与

如果你能处理的对象消失没有它伤害你太糟糕(即它是父母创造你可能是漂亮知道但不是超级重要)然后使用

如果它不是NSObject(so是int,bool float或其他原始类型)使用指定

相关问题