代码之家  ›  专栏  ›  技术社区  ›  Dan Rosenstark

超越NARC:何时保留、何时分配、何时复制

  •  3
  • Dan Rosenstark  · 技术社区  · 14 年前

    我终于明白了我是否必须释放一个对象,以及如何在一个平凡的应用程序中尽可能地降低我的retain计数(通过知道对象是否已经调用了额外的“retain”返回)。所以缉毒局的规定在这方面很有效。

    retain (通常使用保留属性)或 assign 实例变量。有什么经验法则吗?我只知道两个:

    1. 如果我在类中创建了实例(例如,在init中),那么我应该保留它并在 dealloc .
    2. 代理是分配的,而不是保留的

    我见过一些 related questions ,但不是一般的。

    当我在这里的时候: 那些已经添加到 UIWindow UIView 不是我个人保留的?如果他们的superview从所有superview中删除,“自然”保留的实例会被释放吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   JeremyP    14 年前

    如何尽可能地降低我的留用率

    我不明白。是什么让你觉得你需要担心保留计数?retain计数是一个实现细节,忘掉它吧。你所需要担心的就是你是否拥有一件物品。

    我不知道是保留(通常使用retain属性)还是只分配实例变量。

    在几乎所有情况下,在分配实例变量时都希望保留或复制。主要的例外是保留周期。有时,您会发现自己处于这样一种情况:对象a引用对象B,对象B引用对象a。如果A保留了B,而B保留了A,则不能依赖dealloc中释放引用的正常模式使它们消失。在这种情况下,通常指定一个对象为所有者,另一个对象为所有者。拥有的对象将不会保留对所有者的引用。

    委托是一种非常常见的模式,对象的所有者将自己设置为对象的委托。例如,表视图的控制器通常也是表视图的数据源和/或委托。如果表视图保留了委托,则会有一个保留周期(因为控制器已经保留了视图)。这就是为什么会出现“代表不留任”的大会。

    如果要引用的对象实现了NSCopying,并且在拥有所有权的情况下不需要更改它,则绝对应该进行复制。Cocoa的一个例子是NSDictionary中元素的键。如果字典里的钥匙换了,那将是一场灾难。所以字典会复制它的键。

    我知道,风险是保留计数下降到零,我留下来拿包(或留下许多额外的包和内存),但。。。我应该如何组织我的应用程序,这样就不会发生这种情况?

    很简单:遵循 Cocoa memory management rules . 如果某个东西在你持有对它的引用时消失了,那么你并不拥有那个东西。如果需要比当前方法的作用域更久的东西,应该保留它。

        2
  •  10
  •   Dan Rosenstark    14 年前

    对于要执行以下操作的类类型对象:

    • retain
    • copy 如果类来自可变/不可变类集群
    • assign 如果你需要的话 weak references

    至于清理,所有 属性需要 released .

    如果我在类中创建了实例(例如,在init中),那么我应该保留它并在dealloc中释放它。

    问题不是它是否是在类的方法中创建的,而是您是否:

    • 已经拥有了

    如果您还不拥有它,并且希望对它进行强引用,请保留-对于传递到方法中的实例也是如此。通过setter显式或隐式地保留并不重要。