2013-04-27 70 views
1

我知道C/C++和Objective-C之間存在差異,但涉及指針標記*的情況如何呢?這不是用於Objective-C中的指針,還是用這種語言的所有對象指針? I.E,如果我嘗試NSString string = @"Hello";,則XCode告訴我使用NSString *string代替。這是否仍然意味着它是一個指針?Objective-C中的所有對象基本都是指針嗎?

比方說,我有這樣的標準方法(如,這是方法的大多數方法看):

-(void)method:(NSString*)s; 

然後我會送這樣的事情:

NSString *string = @"Hello"; 
[self method:string]; 

請問我保存數據時間或分配或訪問或任何做這樣的事情:

-(void)method:(NSString**)s; 

//and use it like this: 
NSString *string = @"Hello"; 
[self method:&string]; 

或者這是浪費?如果他們已經是指針,我想他們會用這種方式指向指針。

+2

是的。與C++不同,你不能靜態地創建一個對象。嘗試編譯第一個字符串並查看錯誤消息。 – 2013-04-27 13:01:15

回答

6

對象本身不是指針,它們是存儲數據的區域。你在談論的變量是指向那些對象:

NSString *string = @"Hello"; 

這裏,「串」是一個指向NSString文本對象。當傳遞這個變量作爲變量時,你傳遞的是對象的引用。對象的內容(如果它是一個可變對象,其中NSString不是)可以編輯,但引用不能。

通過使用NSString **您正在添加額外的間接級別。現在你傳遞一個指針指向一個指針。你想要這樣做的唯一原因是當你想允許對象(如果有的話)被編輯以及對象的引用。例如,調用一個可選返回一個錯誤的方法時:

NSError *error = nil; 
[someone doStuff:(NSString *)string error:(NSError **)error]; 

現在有人可以實例化一個NSError,並返還給您。

除非這是你的意圖,你不應該使用指針指針。

相關問題