2011-06-01 104 views
5

我在NSDate上創建了一個類別,它將NSDate轉換爲NSString。它使用NSDateFormatter來做到這一點。我發現,分配,然後重新分配格式化每一次在我的應用程序造成明顯的延遲(這個類別的使用非常頻繁),所以我更新了我的「格式化」的方法是這樣的:正確設置方法所需的靜態對象的方法

- (NSString *)pretty 
{ 
    static NSDateFormatter *formatter = nil; 

    if (formatter == nil) 
    { 
     formatter = [[NSDateFormatter alloc] init]; 
     [formatter setDateStyle:NSDateFormatterLongStyle]; 
     [formatter setTimeStyle:NSDateFormatterNoStyle]; 
    } 

    return [formatter stringFromDate:self]; 
} 

這是正確的在Cocoa中處理靜態變量的方法?這是一個泄漏(沒有deallocalloc)?做這樣的事情有更好的方法嗎?謝謝!

+0

請注意,你應該用一個前綴命名你的方法;即'MyApp_pretty'什麼的。防止碰撞。 – bbum 2011-06-01 19:36:42

回答

9

您正在有效地創建一個單身人士。除非不會在應用程序的整個運行會話中使用,否則不要擔心內存使用情況。即使它只是間歇性地使用,留下一個日期格式化程序也不會成爲問題。

I.e.就像單身人士一樣,在應用程序終止之前不要擔心釋放對象。

如果pretty被多線程攻擊(並假設NSDateFormatter本身是線程安全的 - 我沒有檢查文檔,因此,不編寫代碼而沒有驗證線程安全性),那麼你我想保護初始化。

static dispatch_once_t onceMark; 
static NSDateFormatter *formatter = nil; 
dispatch_once(&onceMark, ^{ 
     formatter = [[NSDateFormatter alloc] init]; 
     [formatter setDateStyle:NSDateFormatterLongStyle]; 
     [formatter setTimeStyle:NSDateFormatterNoStyle]; 
}); 
+0

在iOS 4之前呢? – user102008 2011-06-27 21:10:44

+0

使用鎖,@synchronized()或其他一些序列化原語。 – bbum 2011-06-27 21:34:20

-1

我相信你應該保留格式化程序以免泄漏,下次使用格式化程序時,你可能會發生虛假的崩潰。

對於它的價值,我在NSDateFormatter對象的類別中做了這件事情,因爲我也觀察到NSDateFormatter分配速度減慢了我的應用程序。

+6

不需要,因爲alloc,保留計數已經是+1。 – 2011-06-01 17:45:39

+0

@Mark不會自動設置一個積極的保留計數? – Stussa 2011-06-01 17:53:27

+0

我認爲如果'formatter'屬性是一個屬性,並且使用點符號來分配,那麼只會增加保留計數......我的經驗是,您必須在這裏保留它。雖然這可能被認爲是sl,不馴的,但在這種情況下額外的保留並不是那麼糟糕:無論如何,您都希望該對象在程序的整個生命週期中繼續存在。無論如何,我很高興能夠開悟。 :-)我有時候仍然會遇到內存管理問題! NARC; – 2011-06-01 17:58:20