我遵循了内存管理的所有规则,但有人可以向我解释为什么这会导致双重免费例外:
- (NSString *)formattedStringWithDecimal:(NSDecimalNumber *)decimalNumber
{
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:0]; //zero deimal spaces
[formatter setRoundingMode: NSNumberFormatterRoundHalfUp]; //round up
return [[formatter stringFromNumber:decimalNumber] autorelease];
}
这就是我所说的:
//Set the label of the cell formatting the distance from the device
cell.textLabel.text = [NSString stringWithFormat:@"%@ - %@ miles",
selectedAirport.name, [self formattedStringWithDecimal:selectedAirport.milesFromDevice]];
我随后将其更改为现在可以使用的 - 但是我仍然不知道在第一段代码中我做错了什么。
- (NSString *)formattedStringWithDecimal:(NSDecimalNumber *)decimalNumber
{
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:0]; //zero deimal spaces
[formatter setRoundingMode: NSNumberFormatterRoundHalfUp]; //round up
NSString *result = [NSString stringWithString:[formatter stringFromNumber:decimalNumber]];
[formatter release];
return result;
}
答案 0 :(得分:4)
方法stringFromNumber:
返回一个自动释放的字符串。在第一种方法中,返回的字符串第二次被自动释放。此外,在第一种方法中,formatter
从未被释放。简而言之,字符串被释放了一段额外的时间,格式化程序正在泄漏。
第二种方法看起来好多了。也许在释放formatter
和释放stringFromNumber:
返回的字符串之间存在一些混淆。这一行:
return [[formatter stringFromNumber:decimalNumber] autorelease];
将autorelease
消息发送到[formatter stringFromNumber:decimalNumber]
生成的字符串,而不是格式化程序本身。