2011-08-17 64 views
3

我已經嘗試了很多次來理解const關鍵字,但它對我而言並不適用。因此,初始化const對象時非常丟失

我想聲明一個不能改變的對象,也就是說,一個常量對象。例如,在.h文件:

extern MyClass *use_this_object; 

,並在.m文件:

MyClass *use_this_object; 

+ (void) Initialize { 
    use_this_object = [MyClass new]; 
} 

現在,我在哪裏可以把一個常量,使其他類可以訪問use_this_object但不能修改它(假設MyClass是不可變的),而MyClass類可以初始化變量?

這甚至可能嗎?或者我應該使用靜態方法來檢索常量而不是聲明它是外部的?

+0

嗯,我認爲它也可能適用於C,因爲它們在很多方面都很相似。但顯然不是在這種情況下。 –

回答

8

Objective-C中沒有這樣的「const對象」。有const 指針並且有不可變的對象。一個指向不可變對象的const指針就是你正在談論的內容,但是你不能在運行時分配這些指針。

對於可在編譯時(我只知道一個,NSString)的分配對象,你可以這樣做:

NSString * const kMyString = @"string"; 

這是一個常量指針到(不變)NSString。你從右到左閱讀這些東西。

要創建你想要什麼,你需要一個函數或方法與內部static這樣的:

+ (Something *)something { 
    static Something *something = nil; 
    if (! something) { 
     something = [Something new]; 
    } 
    return something; 
} 

這是優於使用全局反正不是真正的常量其他東西(如字符串和整數)。

由您決定Something是不可變的。

編輯只是關於上述代碼的說明。這只是一個如何在運行時創建靜態對象的例子。有很多方法可以做到這一點,包括使用+initialize與靜態文件(這是目前我創建單身人士的首選方式)之間的各種權衡。不要把上面的代碼當作唯一的方式。這只是與const最接近的方式,因爲程序的其他部分無法直接訪問指針。

+0

加一個「你從右到左讀這些東西。」 – Feroz

2

我會使用靜態方法,似乎更簡單。