如何避免(潜在)内存泄漏

我有一个for循环,在开始时声明一个NSObject“value”,然后实际创建一个“value”内的switch语句。 “值”可以是NSNumber,NSDate,NSData,NSString或nil。 这是代码:

for (int i = 0; i < self.columnCount; i++) {
  NSObject *value;
  switch (mysql_fields[i].type) {
    case ...
      ...
    case MYSQL_TYPE_LONG:
      value = [[NSNumber alloc] initWithInt:atoi(row[i])];
      /* [value autorelease]; */  // 2)
      break;
    case MYSQL_TYPE_DECIMAL:
      NSString *decimal = [[NSString alloc] initWithCString:(char *)row[i] encoding:NSUTF8StringEncoding];
      value = [[NSDecimalNumber alloc] initWithString:decimal];
      /* [value autorelease]; */  // 2)
      [decimal release];
      break;
    case ...
      ...
  } // end of switch
} end of for
Field *field = [[[Field alloc] initWithRecord:record] autorelease];
/* [value autorelease]; */  // 3)
[field setValue:value forKey:@"value"];
/* [value release]; */  // 4)

现在我不知道如何释放“价值”。 这是我试过的和相应的Xcode 4“分析器”消息:

  • 没有发布 - >“潜在泄漏”
  • 在每个case语句中的alloc / init之后的[value autorelease] - >“object autorelease too much times”
  • [value autorelease]直接在上次使用之前 - >“对​​象发送过多次autorelease”
  • 上次使用后的[值释放] - >“此时调用者不拥有的对象的引用计数的错误递减”

  • 仅在分配对象时添加autorelease,删除其余部分:

    value = [[[NSNumber alloc] initWithInt:atoi(row[i])] autorelease];
    // ....
    value = [[[NSDecimalNumber alloc] initWithString:decimal] autorelease];
    

    你在for循环中声明了value ,所以你必须在开关后面释放它,但是在for循环中。

    for (int i = 0; i < self.columnCount; i++)
    {
        NSObject *value;
        switch (mysql_fields[i].type)
        {
            case ...
                ...
            case MYSQL_TYPE_LONG:
                value = [[NSNumber alloc] initWithInt:atoi(row[i])];
                break;
            case MYSQL_TYPE_DECIMAL:
                NSString *decimal = [[NSString alloc] initWithCString:(char *)row[i] encoding:NSUTF8StringEncoding];
                value = [[NSDecimalNumber alloc] initWithString:decimal];
                [decimal release];
                break;
            case ...
                ...
        }
        Field *field = [[[Field alloc] initWithRecord:record] autorelease];
        [field setValue:value forKey:@"value"];
        [value release];
    }
    
    链接地址: http://www.djcxy.com/p/84275.html

    上一篇: how to avoid (potential) memory leak

    下一篇: C switch on NSString?