【问题标题】:Should a (copy) @property be released? Is Apple's sample code correct?是否应该发布(副本)@property?苹果的示例代码是否正确?
【发布时间】:2011-03-07 21:22:30
【问题描述】:

这个问题是指 Apple 的示例“TableSearch”项目,该项目实现了可搜索的表格视图。相关源代码可以在这里找到:

MainViewController.h

MainViewController.m

在这个示例项目中,“MainViewController”类有一个属性来保存搜索词:

@property (nonatomic, copy) NSString *savedSearchTerm;

但是dealloc没有释放“savedSearchTerm”:

- (void)dealloc
{
    [listContent release];
    [filteredListContent release];

    [super dealloc];
}

(示例代码不会在其他任何地方释放“savedSearchTerm”(尽管在 viewDidLoad 的某些情况下它确实将其设置为 nil)。

鉴于 Apple 的内存管理规则说您应该释放使用“alloc”、“new”或“copy”创建的对象,为什么不需要释放“savedSearchTerm”?

【问题讨论】:

    标签: cocoa ios memory-management


    【解决方案1】:

    它应该在-dealloc 方法中释放。如果示例代码没有这样做,请在http://bugreport.apple.com 提交错误,它将被修复。

    【讨论】:

      【解决方案2】:

      我还没有看到示例,但正如您描述的那样,saveSearchTerm 需要发布。

      通过

      self.saveedSearchTerm = nil;
      

      [savedSearchTerm release];
      

      如果你看到简单

      savedSearchTerm = nil; 
      

      那么这很可能是内存泄漏,因为它只是将 ivar 设置为 nil 而没有释放对象。

      【讨论】:

      • 您不应该在dealloc 代码中使用setter。正确的做法是直接释放 ivar。
      • @Dave Delong - 这样做的理由是什么?你能指点我一些文档吗?
      • @Dave Apple 文档显示了两种方式,甚至说您必须在较新的运行时使用属性设置器(我认为现在是错误的..)。此外,虽然可以说这是不可取或不好的,但释放 ivar 将绕过该属性的 KVO 过程。 developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
      • @TomSwift:这正是重点;在 dealloc 中调用方法可能会触发不必要的副作用,尤其是,如果您有其他对象观察正在释放的对象。通过使用 setter,您可能会触发 KVO 通知触发,这将触发观察者,他们可能会尝试访问部分释放的对象并期待某个对象状态。如果该状态不存在,或者他们尝试访问的数据不再存在,则可能会发生坏事。
      • @TomSwift:这在您自己的应用程序中不是什么大问题(只要您小心!),但是如果您使用任何类型的公开可用代码(github 或一个框架或任何东西)这是你需要敏锐地意识到的东西。
      猜你喜欢
      • 2012-10-17
      • 2019-01-05
      • 2019-06-12
      • 2010-12-19
      • 2013-10-13
      • 1970-01-01
      • 2011-05-16
      • 2010-10-18
      • 2019-11-15
      相关资源
      最近更新 更多