【问题标题】:How to handle returned object from function to avoid memory leaks?如何处理函数返回的对象以避免内存泄漏?
【发布时间】:2011-05-17 09:10:40
【问题描述】:

假设我有一个函数

- (NSString *)fullNameCopy {
    return [[NSString alloc] initWithFormat:@"%@ %@", self.firstName, self.LastName];
}

谁能告诉我如何调用这个函数,如何将它的值分配给一个新对象,然后如何释放它,避免内存泄漏和错误访问。

会不会是这样的

NSSting *abc = [object fullNameCopy];

// 使用并释放

[abc release];

或者我也应该分配 abc 字符串?

更新:

这里的重点,我可以从一个函数中返回非自动释放对象,然后在调用函数中释放它们。根据 Obj-C 函数命名约定,包含 alloc 或 copy 的函数名应返回对象,假设调用函数具有所有权。

与上述情况一样,我的函数“fullNameCopy”返回一个非自动释放的对象,我想在调用函数中释放它们。

【问题讨论】:

    标签: iphone objective-c memory-management


    【解决方案1】:

    你是对的。由于方法名称包含单词“copy”,Cocoa 约定规定该方法返回调用者拥有的对象。由于调用者拥有该对象,因此它负责释放它。例如:

    - (void)someMethod {
        NSString *abc = [object fullNameCopy];
    
        // do something with abc
    
        [abc release];
    }
    

    或者,您可以使用-autorelease 代替-release

    - (void)someMethod {
        NSString *abc = [[object fullNameCopy] autorelease];
    
        // do something with abc
    }
    

    【讨论】:

      【解决方案2】:

      参考this帖子

      更新:

      - (NSString *)fullNameCopy {
          NSString *returnString  = [NSString stringWithFormat:@"%@ %@", self.firstName, self.LastName]; // Autorelease object.
          return returnString;
      }
      
      -(void) someFunction {
          NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
      
          NSString *fullName = [self fullNameCopy];
      
          [pool release]
      }
      

      【讨论】:

      • Thanx pratikshabhisikar 我的意思是,我在函数名中使用了“复制”字样,所以我想返回一个非自动释放的对象,所以调用方法持有返回对象的所有权,并且负责放行。这可能吗?
      • 是的,这是可能的。但它不在最佳实践中。当你制作巨大的 API 并做这些事情时,用户将不得不手动释放并且不知道它会导致内存泄漏,最后说你的 API 不好。
      • @prat 不正确。 OP 正确地遵循了一个约定,即名称中包含“复制”一词的方法返回一个由调用者拥有的对象。如果开发人员不知道该规则,则(s)他不知道 Cocoa 中的内存管理。
      • 感谢大家的帮助,特别是@pratikshabhisikar 和@Bavarious。
      【解决方案3】:

      像这样:

      - (NSString *)fullName { NSString * retVal = [[NSString alloc] initWithFormat:@"%@ %@", self.firstName, self.LastName]; 返回[retVal自动释放]; }

      然后

      NSSting *abc = [对象全名];

      【讨论】:

      • 名称包含“copy”的方法返回调用者拥有的对象。在您的回答中,该方法返回一个不属于调用者的对象
      • 现在您的答案正确地遵循了 Cocoa 命名约定,但这并不是 OP 所要求的。
      • 我很困惑。那不会使字符串泄漏吗?
      • 如果调用者(自动)释放对象,则不会。名称包含“copy”的方法返回调用者拥有的对象。如果调用者释放对象,一切都很好。如果调用者没有释放对象,那就是内存泄漏。
      【解决方案4】:

      return [[[NSString alloc] initWithFormat:@"%@ %@", self.firstName, self.LastName]autorelease];

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-15
        • 1970-01-01
        • 2012-02-12
        • 1970-01-01
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多