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

Iphone 格式化程序类中的内存管理错误,iphone,objective-c,Iphone,Objective C,我已经遵循了内存管理的所有规则,但是有人能解释一下为什么这会导致双重空闲异常: - (NSString *)formattedStringWithDecimal:(NSDecimalNumber *)decimalNumber { NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; [formatter setMaximumFractionDigits:0]; //zero deimal spaces

我已经遵循了内存管理的所有规则,但是有人能解释一下为什么这会导致双重空闲异常:

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

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

第二种方法看起来更好。在释放
formatter
和释放
stringFromNumber:
返回的字符串之间可能存在一些混淆。该行:

return [[formatter stringFromNumber:decimalNumber] autorelease];

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

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

第二种方法看起来更好。在释放
formatter
和释放
stringFromNumber:
返回的字符串之间可能存在一些混淆。该行:

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