2011-02-16 28 views
1

當我們定義下面的語法變量是否意味着它所有的時間掛在記憶:使用靜態常量 - 內存暫停?

static NSString *const kMyLabel = @"myLabel"; 

我有常數100。我應該使用#define預處理器編譯器,考慮到#define不會將它們保留在內存中。

回答

1

將會有一個恆定的靜態變量和#define指令之間沒有什麼區別。當使用#define時,預處理器會在每次使用時使用@「myLabel」替換變量。這可能意味着每次使用都有一個字符串實例,但編譯器將它們組合起來,以便二進制文件中的任何字符串都是唯一的。使用常量靜態代碼將在需要時加載變量的位置。這意味着#define可能會稍微快一點,因爲獲取字符串的解引用較少,但它不會顯示。

+0

不是* *很真實。如果常量字符串來自另一個二進制文件,則可以將其作爲外部引用,並且只有一個唯一副本而不是每個二進制文件。 –

+0

@Catfish_Man沒錯,但在問題的定義是靜態的,所以它可以除非包裝是爲它做不來外部引用。 – ughoavgfhw

+2

這不是真的,@Catfish_Man。或者更明確地說,它是鏈接時間優化的一個功能。從理論上講,鏈接器將通過鏈接單元分離所有字符串,並且只有一個副本。類似的優化可以通過dyld共享緩存完成。在實踐中,我不確定線條在哪裏繪製。 – bbum

3

硬編碼字符串,格式@"my string",烘烤成應用二進制。爲了使是永久性的,你必須做的:

static NSString *kMyLabel = nil; 

...somewhere else 
kMyLabel = [[NSMutableString alloc] initWithString:@"myLabel"]; 

但是,這會是愚蠢的,因爲你不得不在內存都@"myLabel"(因爲它是應用程序二進制文件的一部分)和你分配的字符串。所以記憶倍增。

簡而言之:

如果你有一個常量字符串,沒有辦法從內存到「卸載」它。除非你將一本書的幾個章節刻錄到二進制文件中,否則它不會是一件值得擔心的事情。你是否認爲它是一個性能問題?

1

這將是「記憶」,但它將是你的應用程序的可執行文件的內存映射區域。如果存在內存壓力,那麼該頁面將被刷新而不寫入磁盤。

基本上,它是「免費」的,除了IO上啓動一點點。跟他們一起瘋狂吧。