如何避免(潜在)内存泄漏
我有一个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“分析器”消息:
仅在分配对象时添加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