将每个财产设置为强大有什么缺点?

时间:2013-12-12 20:48:22

标签: ios objective-c cocoa-touch

作为一名新的iOS程序员,我今天遇到了大量的错误,其中一些与我使用弱属性而不是强大有关。

我意识到一个优秀的程序员不会遇到这个问题,并且只会将属性设置为强大的需要,但是,在我的新手眼中,我看不出为什么我应该使用弱,它只会添加有问题的风险。

4 个答案:

答案 0 :(得分:7)

一般情况下,您应该通过查看持有该属性的类与该属性的值之间的关系来决定weakstrongassigncopy之间的关系。财产,以及通过的财产的种类。

  • 如果要设置的属性是原始属性,请使用assign(或根本不使用所有权限定符)
  • 如果要设置的属性是标量的不可变对象,请使用strong
  • 如果正在设置的属性是实现NSCopying协议的标量,可变对象,请使用copy
  • 如果设置的属性是可变的,并且所有权已转移到您的对象,请使用strong
  • 如果正在设置的属性是实现NSCopying协议的可变对象,但所有权仍由调用方保留,请使用copy
  • 如果要设置的属性是后引用(即“子”对象中的“to parent”属性),请使用weak

所有权的概念在引用计数的内存模型中非常重要。这是您决定的主要驱动因素。您需要确定对象的主要所有者,并为该所有者提供强大的引用。如果所有权在一组对象之间共享,请给予他们强有力的参考。

最困难的情况是物体可以直接或间接地相互拥有。在这种情况下,您最好将“所有权”替换为“了解”,为所有对象提供“拥有”每个人的共同“顶级”所有者,并使用weak引用来模拟“了解”关系。< / p>

答案 1 :(得分:1)

weakstrong对于实现内存管理非常重要。

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

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

你应该总是考虑你的记忆管理,但一个好的经验法则是该属性应该始终是strong,除非你肯定知道它被保留在其他地方。只要没有循环引用,多个对象就可以对同一个对象进行strong引用,没有任何问题。

答案 2 :(得分:1)

一些超级基本的经验法则:

如果您希望对象至少附近,直到您完成它,请使用强大

如果你可以处理对象消失而不会伤害你太糟糕(也就是创建你的父母可能很好知道但不是非常重要)然后使用

如果它不是 NSObject (因此是int,bool float或其他原始类型),请使用 assign

答案 3 :(得分:-3)

我使用的经验法则是:如果对象保留在其他地方,请使用弱。对我来说最重要的是使用界面构建器。如果您有IBOutlet,则可以使其变弱,因为该对象在接口构建器和XIB文件中处理