格式化程序类中的内存管理错误

时间:2010-11-08 17:02:12

标签: iphone objective-c

我遵循了内存管理的所有规则,但有人可以向我解释为什么这会导致双重免费例外:

- (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;
}

1 个答案:

答案 0 :(得分:4)

方法stringFromNumber:返回一个自动释放的字符串。在第一种方法中,返回的字符串第二次被自动释放。此外,在第一种方法中,formatter从未被释放。简而言之,字符串被释放了一段额外的时间,格式化程序正在泄漏。

第二种方法看起来好多了。也许在释放formatter和释放stringFromNumber:返回的字符串之间存在一些混淆。这一行:

return [[formatter stringFromNumber:decimalNumber] autorelease];

autorelease消息发送到[formatter stringFromNumber:decimalNumber]生成的字符串,而不是格式化程序本身。