2011-08-03 53 views
5

我讀通過大書呆子牧場書上的iOS編程和我有一個關於他們在第7章iOS的基本內存管理

建立在某一點上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。格式化程序使用allocinit創建。我總是得知,alloc需要在某個地方發佈,對吧?當formatter得到timeLabel,不是timeLabel發送retain它?並且不能(不應該?)我隨後發佈formatter

我瀏覽了接下來幾頁的代碼,除了release發送到dealloctimeLabel外,我無法在任何地方找到任何發佈消息。

我在這裏混合的東西? formatter是不是應該由我發佈的理由嗎?我想成爲一名優秀的記憶公民。任何幫助表示讚賞:)

回答

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]; 
} 
+0

感謝您的建議。如果它在應用程序的整個生命週期中保持活躍狀態​​,這是否意味着我應該在dealloc中釋放它,或者根本不釋放它?說實話,這有點困惑。 – cabaret

+0

不,它不會被釋放,它不會創建內存泄漏,除非再次指定格式化程序並將其先釋放。這就是爲什麼有一個如果檢查。 – Joe

+0

好吧,我想我明白了。非常感謝。 – cabaret

1

setText只是得到一個字符串(不格式化本身),所以格式化程序不保留。我敢打賭,他們所使用的格式中某處控制器等它的dealloc得到釋放

+0

不介意dealloc部分,沒有看到它是靜態的,但第一部分仍然是真的 – ksn

+0

好的,謝謝。我會牢記setText。 :) – cabaret

2

因爲static關鍵字formatter將保持可用,直到下一次調用該方法,爲全局變量的 - 當然,沒有是全球

參見維基百科條目約static

+0

感謝您的快速回復。維基條目清除了一些關於「靜態」的東西:) – cabaret