【问题标题】:Does "self.propery = [[SomeClass alloc] init];" leak memory?是否“self.propery = [[SomeClass alloc] init];”泄漏内存?
【发布时间】:2010-08-23 16:36:52
【问题描述】:

在 Objective-C 中编写是否安全

self.propery = [[SomeClass alloc] init];

而不是

SomeClass *tmp = [[SomeClass alloc] init];
self.property = tmp;
[tmp release];

还是第一个表单会泄漏内存?

【问题讨论】:

  • 向我们展示“property”的属性声明。那是@property 行。

标签: objective-c memory-management


【解决方案1】:

除非您提供自定义属性设置器,否则第一个示例会泄漏。您可以使用:

self.propery = [[[SomeClass alloc] init] autorelease];

相反。

【讨论】:

  • 谢谢。这不会保留内存直到 NSAutoreleasePool 被释放(即默认情况下,直到我退出应用程序)?
  • 我的理解是,自动释放池通常会在每次执行“运行循环”之后(在应用程序退出之前)释放。这是假设您正在编写 Cocoa 或 Cocoa Touch 应用程序。
【解决方案2】:

这取决于属性是如何定义的。如果它是用保留或复制定义的,那么,是的,你的第一个例子会泄漏。

【讨论】:

  • 如果@propriety 带有assign,那么它就不会泄漏。确实如此。但是,如果以后想使用该值(而不是您设置它的位置),则保留该值是礼仪的责任。
  • 属性有“保留”。我有点希望有一种方法可以在没有临时变量的情况下将新对象分配给属性 - 我太习惯于使用垃圾收集器,可能(不,我不希望在我的应用程序中使用它 - 如果我要去学习Objective-C,我最好按原样吞下去)。谢谢
【解决方案3】:

第一个会泄漏。

当您不再需要时,您必须释放或自动释放您 [[ alloc] init] 的任何东西。

请参阅此guide。

【讨论】:

    【解决方案4】:

    您的属性是否定义为保留、复制或分配并没有什么区别。当您使用[[SomeClass alloc] init] 创建一个类的本地实例时,您有责任在它创建的范围内释放它。

    凯文的回答是正确的。如果您不想创建、设置、发布 - 您可以使用 autorelease。主自动释放池会不时耗尽,您将不会在应用程序的整个生命周期内使用该内存。

    值得注意的是,自动释放池的不可预测性意味着您无法确定何时释放该内存。如果在 iPhone 等内存受限的平台上工作,则应避免使用自动释放,除非在必要的地方。

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 2012-04-13
      • 2012-09-13
      • 2020-07-22
      • 2010-10-13
      • 2019-01-28
      • 2015-02-07
      • 2011-01-29
      • 2011-05-08
      相关资源
      最近更新 更多