2012-06-04 42 views
1

Cocoa類中有接受指針地址的方法。最常見的論點是CoreData驗證方法中的未來NSError *對象的地址(等等)。通過這種方式,可以將自定義或擁有的對象放置在給定參數指向的地址的位置。默認情況下,Objective C方法中參數的指針是否爲const?

我的問題是:爲什麼我們不能用簡單的指針參數來做到這一點?例如。比方說,我有一個方法:

- (void)addObject:(id)someObject toArray:(NSMutableArray *)array; 

我可以很容易地通過可變數組作爲第二個參數,調用它addObject:和方法後調用數組將被修改。爲什麼這不與NSError *對象完成?傳遞給方法的指針默認定義爲const?這是爲了避免訪問NULL

回答

2

爲什麼不用NSError *對象來完成這項工作?

因爲沒有這樣的東西作爲NSMutableError。您的示例工作原因是您可以修改數組的內容而不修改指向數組本身的指針。但是,由於NSError實例是不可變的,因此無法修改NSError。因此,您必須創建一個新的錯誤對象。如果您想要將該錯誤對象與其他一些數據一起返回,那麼至少必須通過一個輸出參數(例如NSError **)完成其中的一個。

傳遞給方法的指針是否默認定義爲const?

沒有。在這種方法中,你可以這樣做:

- (void)addObject:(id)someObject toArray:(NSMutableArray *)array { 
    someObject = somethingElse; 
    [array addObject:someObject]; 
} 

這裏需要記住的重要一點是,你只需要改變內存中一個槽中的指針。與someObject對應的內存插槽僅僅是堆棧中的一個空間,並且您將該空間的內容更改爲具有指向與給定的對象不同的分配對象的值。

這是爲了避免訪問NULL?

任何NULL您需要的保護必須自己完成。

+0

NULL保護內置到Objective-C中不少,它很好。我喜歡在數組爲空或空的情況下知道[數組數] == 0。在這一點上,Ruby和許多其他語言爆炸了,在很多情況下你需要額外的代碼來處理null。 –

+1

@TomAndersen通過'nil'和消息'nil'是有區別的。 '[nil addObject:blah]'沒有效果。 '[array addObject:nil]'會炸燬你的臉。 –

1

這是因爲NSError類沒有定義任何方式來修改創建後的實例。指針本身是可變的,但是NSError不是。

0

它們都是簡單的C指針。除非讓它們成爲const,否則它們不是const的。 Const指針在Objective-C中的大多數情況下並不是一件好事,甚至常常是普通的C. Const指針是一個微妙的概念,意義和語法的複雜性與Objective-C風格節目。忘記它們存在可能是一個很好的初步近似。

例如:NSArray的和NSMutableArray裏 - 我們不需要一個NSArray類,如果常量的工作「正確」 - 但它不能因C.

的設計

** - 對於NSError等等,想法是創建一個NSError,而不是改變你傳入的那個。換句話說,你需要一個指向指針的指針來創建一個實例(即改變實際的對象)。

相關問題