Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C:切换内部循环-如何避免(潜在)内存泄漏_Objective C_Release_Switch Statement_Autorelease_Alloc - Fatal编程技术网

Objective c 目标C:切换内部循环-如何避免(潜在)内存泄漏

Objective c 目标C:切换内部循环-如何避免(潜在)内存泄漏,objective-c,release,switch-statement,autorelease,alloc,Objective C,Release,Switch Statement,Autorelease,Alloc,我有一个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

我有一个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)
for(int i=0;i
现在我不知道如何释放“价值”。这是我尝试的内容和相应的Xcode 4“Analyzer”消息:

  • 无泄漏->潜在泄漏
  • 每个case语句中alloc/init之后的[value autorelease]->“对象发送autorelease的次数太多”
  • [值自动释放]直接在上次使用之前->“对象发送自动释放的次数太多”
  • 上次使用后的[value release]->“此时调用方不拥有的对象的引用计数减少不正确”

  • 仅在分配对象的位置添加自动释放,删除其余部分:

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

    您正在for循环内声明
    ,因此必须在切换后但在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];
    }
    
    for(int i=0;i
    这与案例2相同),给我“Analyzer”中的“object sent autorelease To Family times”(对象发送自动释放次数过多)。这是案例4),给我示例案例4中“Analyzer”中的“此时调用方不拥有的对象的引用计数的不正确递减”消息在for循环之外。这是一个巨大的差异。这是真的-但是在简化这个问题的代码时,错误潜入了。对此很抱歉。已解决:在其中一个case语句中,我从NSString类方法创建了“value”,而不是像在所有其他case语句中那样使用alloc/init。类方法创建的对象是“自动删除的”。