2012-11-30 37 views
2

如果我有一個C字符串是這樣的:常量說明符在指向對象的指針前做了什麼?

const char* str= "hello"; 

我清楚地知道,因爲指針是常量我不能改變字符串的任何字符。
但是,如果我有這樣的:

- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location 

我可以使用它的方法仍然發生變異的對象的狀態。
如果指針是一個NSMutableString,我仍然可以改變它。
那麼const代表什麼?

回答

1

在該方法中聲明,location是指向一個恆定CLLocation。但是,當您向location對象發送消息時,const-不會被保留;處理該消息的方法將self視爲非const對象。 (注意,這是比C++,它支持const成員函數,其中this是一個指向常量對象不同。)

因此,在這種聲明的const不是特別有用。也許它是由習慣C++方式的人編寫的。

當你看到const附接到在Objective-C的對象的指針,它通常是這樣的:

extern NSString * const SomeConstantString; 

這聲明SomeConstantString作爲常數指針一些非恆定的對象(在這種情況下, NSString)。指針本身是不變的,所以你的程序不能改變SomeConstantString指向一些其他的NSString對象。

1

心靈的區別:

// constant pointer 
char * const str = ""; 

// pointer to constant (two equivalent ways) 
const char * str = ""; 
char const * str = ""; 

const關鍵字應用於適用於任何立即是其左。如果左邊沒有任何東西,它適用於右邊的任何東西。

在Objective-C中,所有的方法參數總是按值傳遞。這包括基元,結構,聯合和指針,以及任何其他組成類型。

請注意,您不能有對象類型的變量。像NSObject o;這樣的表達式會產生編譯器錯誤消息「接口類型不能靜態分配」。

傳遞對象的唯一方法是傳遞一個指針。該指針作爲值傳遞,但讓方法內的代碼引用該對象並對其進行更改。所以在某種程度上,它是就好像你通過引用傳遞對象(實際上你正在通過值傳遞指針)。

當編譯一個Objective-C程序時,這些方法被轉換成C函數,並且每個「消息發送」(又名「方法調用」,雖然不完全相同)使用運行時函數objc_sendMsg運行。此功能不知道或關心您是否使用const來限定對象。如果你想要一個不可變的對象,你必須在對象內編寫這個不可變性。例如:

// const qualifying an object is ignored whether in variables or method arguments: 
const NSMutableArray *array = [NSMutableArray new]; // const is ignored 
-(void)someMethod:(const NSMutableArray *)array { ... // const is ignored 

// calling the methods that mutate the object works fine 
[array removeAllObjects]; 
1

我知道我不能改變字符串的任何字符,因爲 指針是const。

不,指針是可變的。它指向的字符是const。

我仍然可以使用它的方法改變對象狀態。

Objective-C對象沒有const正確性,就像在C++中一樣。編譯器不關心你發送給const對象的消息(變異與否)。所以在聲明一個const對象的指針時沒有任何意義。引用的框架方法是一種異常,可能是一種疏忽。

+0

我搞砸了這句話。 –

相關問題