iOS基本内存管理

cab*_*ret 5 iphone memory-management ios4 ios

我正在阅读有关iOS编程的Big Nerd Ranch书籍,我对他们在第7章中创建的Hypnotime程序提出了疑问.

在某些时候,他们实现以下方法:

- (void)showCurrentTime:(id)sender
{
    NSDate *now = [NSDate date];

    static NSDateFormatter *formatter = nil;

    if (!formatter) {
        formatter = [[NSDateFormatter alloc] init];
        [formatter setTimeStyle:NSDateFormatterShortStyle];
    }

    [timeLabel setText:[formatter stringFromDate:now]];

}
Run Code Online (Sandbox Code Playgroud)

我的问题是关于NSDateFormatter *formatter.格式化程序使用alloc和创建init.我总是知道有什么东西alloc需要在某个地方发布,对吧?什么时候formatter传递给timeLabel,不timeLabel发送retain给它?不能(不应该?)我随后发布formatter

我通过对接下来的页面代码浏览,我找不到任何地方的任何释放消息,除了release存在发送到timeLabeldealloc.

我在这里混合了吗?有没有理由formatter不应该被我释放?我想成为一个好记忆的公民.任何帮助表示赞赏:)

Joe*_*Joe 1

他们将格式化程序声明为静态,因此目的是使格式化程序在应用程序的整个生命周期内保持活动状态。这是出于性能原因,并且可能是一种不成熟的优化,因此不要将此作为您自己未来开发的最佳实践。

//static (even in a method) will allow formatter to live during entire app lifecycle
static NSDateFormatter *formatter = nil;

//Check if formatter has been set (this is not thread safe)
if (!formatter) {
    //Set it once and forget it, it wont be a leak, and it wont ever be released
    formatter = [[NSDateFormatter alloc] init];
    [formatter setTimeStyle:NSDateFormatterShortStyle];
}
Run Code Online (Sandbox Code Playgroud)