【问题标题】:Potential memory leak in NSData categoryNSData 类别中的潜在内存泄漏
【发布时间】:2012-01-26 01:26:57
【问题描述】:

使用 XCode 分析器时,我收到一条消息:

已分配对象的潜在泄漏

这个代码在我的NSData(String)分类里,代码是:

- (NSString*) utf8String
{
    return [[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding];
}

现在我该如何解决这个问题?当我将语句更改为:

- (NSString*) utf8String
{
    return [[[NSString alloc] initWithData:self encoding:NSUTF8StringEncoding] autorelease];
}

我的应用程序在我调用 utf8String 的线路上崩溃。

【问题讨论】:

    标签: objective-c ios xcode memory-management autorelease


    【解决方案1】:

    cocoa 命名约定建议所有方法都返回自动释放的对象,但名称以“init”、“copy”或“new”开头的方法除外。静态分析器知道并检查这一点。

    你有两个选择。可以将方法重命名为-newUTF8String,也可以返回一个自动释放对象,当你想存储这个方法的返回值时,可以保留它。

    我更喜欢后者,但两者都是有效代码。

    【讨论】:

      【解决方案2】:

      我猜你的应用程序崩溃是因为变量在使用之前就被释放了。如果不立即使用返回值,建议调用retain,而是将其存储在成员变量中。

      ...
      myMemberVariable = [something utf8String];
      [myMemberVariable retain];
      ...
      

      为确保您不会产生内存泄漏,您必须在某处释放成员变量。一个好地方是dealloc

      - (void)dealloc {
          if (myMemberVariable) [myMemberVariable release];
      
          [super dealloc];
      }
      

      我还建议您查看Advanced Memory Management Programming Guide 以获取有关 iOS 内存管理的一些详细信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-10
        相关资源
        最近更新 更多