我正在阅读有关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]];
}
我的问题是NSDateFormatter *formatter
。格式化工具使用alloc
和init
创建。我总是知道alloc
需要在任何地方发布,对吧?将formatter
传递给timeLabel
时,timeLabel
是否retain
向其发送了formatter
?不能(不应该?)我随后发布release
?
我浏览了下几页的代码,除了timeLabel
发送到dealloc
中的formatter
之外,我无法在任何地方找到任何发布消息。
我在这里混合了吗?我不应该释放{{1}}的原因吗?我想成为一个好记忆的公民。任何帮助表示赞赏:)
答案 0 :(得分:2)
由于static
关键字formatter
将在下次调用方法之前保持可用,因此作为全局变量 - 好吧,不是全局
请参阅有关static
的维基百科条目答案 1 :(得分:1)
setText只获取一个字符串(不是格式化程序本身),因此不保留格式化程序。我敢打赌,他们在控制器中的其他地方使用格式化程序,因此它在dealloc中被释放
答案 2 :(得分: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];
}