【问题标题】:Objective-C: basic memory management. Ownership of object?Objective-C:基本的内存管理。对象的所有权?
【发布时间】:2011-12-22 19:43:33
【问题描述】:

我正在浏览苹果的Advanced Memory Management Programming Guide

对于以下代码:

-(NSString *)fullName {
    NSString *string = [NSString stringWithFormat:@"%@ %@",
                                                  self.firstName,
                                                  self.lastName];
    return string;
}

按照基本规则,您不拥有 stringWithFormat: 返回的字符串,因此您可以安全地从方法中返回字符串。

...因此,不必释放它。

指南另一部分的基本规则:

您使用名称以“alloc”、“new”、“copy”或“mutableCopy”开头的方法创建对象

...这使您成为所有者)

那么,谁拥有这个字符串?

【问题讨论】:

    标签: objective-c memory-management


    【解决方案1】:

    此时,自动释放池拥有该字符串。它最初是由 Foundation 框架创建的,它分配对象并因此成为它的所有者。 Foundation 然后通过调用autorelease 将其所有权切换到自动释放池,然后将对象返回给您的代码。

    【讨论】:

      【解决方案2】:

      “拥有”这个词很糟糕——在某些情况下合适,但不普遍。真正的问题是:

      1) 您确定该对象将被retained 直到您不再需要访问它?

      2) 当它不再需要时,您是否负责releaseing? (后一个属性可以被认为是“所有权”。)

      在上面的例子中,对象是retained,当应用程序“出现”时,对象是autoreleased。因此,您不负责发布它,并且在您的方法调用期间(及以后)它将是retained,您无需付出更多努力。

      【讨论】:

      • +1 同意整个“所有权”概念不太合适,但很难避免,因为 Apple 在某些时候将其添加到文档中。
      【解决方案3】:

      当你使用 stringWithFormat: 时,调用者没有对象的所有权。因此,您可以在不调用 autorelease 的情况下返回对象。如果您使用了 initWithFormat:,则需要在返回之前自动释放该对象。

      【讨论】:

        【解决方案4】:

        您拥有自己创建(使用分配/复制)或保留的对象。
        作为一个经验法则,工厂方法返回的对象最有可能是自动释放的对象,不需要释放它们。
        这解释了为什么不应该释放从stringWithFormat 方法获得的 NSString。
        在您的第一种情况下,以下更改将使字符串拥有返回的对象。

        string = [[NSString stringWithFormat:@"%@ %@",self.firstName,self.lastName] retain];
        

        使用 alloc/copy 您可以创建需要明确释放的对象 - 这解释了您的第二种情况。

        【讨论】:

          猜你喜欢
          • 2012-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-30
          • 1970-01-01
          • 1970-01-01
          • 2020-01-27
          相关资源
          最近更新 更多