這樣做並沒有真正的優勢;一般而言,您應該期望您的界面的客戶將尊重該界面的合同。
在許多基礎值和容器類型(NSString
等),它的問題甚至更少的情況下;由於免費橋接機制的實現細節,可變和不可變變體實際上都是同一類的實例。例如,NSString和NSMutableString的init
方法實際上都返回__NSCFString的實例,該實例從兩者繼承。該對象保留了您調用的API的可變性或不變性,但您無法通過查看該類是否可變來判斷。
換句話說,無論您是否創建了可變對象,[aString isKindOfClass:[NSMutableString class]]
將始終返回YES
。因此,使用該API來檢查是否可變是不可行的,所以不用擔心API的客戶端是否會嘗試這樣做。
編輯: 我最初說,你無法通過檢查類的數組無論是可變的或不說,但事實證明,在NSArray
的情況下,你可以告訴。 (感謝@albertamg捕捉錯誤。)我已經改變上面的例子使用NSString
,這是一個情況下,你真的不能出來。但是,一般來說,如果有人將你返回的對象當作不可變形的對象處理時,我會認爲它是一個錯誤,並且不會擔心它周圍的編程。再次
編輯: 因此,原來在OS X和iOS的某些版本中,你無法察覺的NSArray
mutablility下去,但在最近的版本,他們已經改變了,這樣你可以執行。但是,您仍然無法在NSString
中檢測到它。因此,從所有這一方面帶回家的教訓是,您不應該在作爲class cluster的一部分的對象上使用isKindOfClass:
。
「當你調用一個方法並接收返回一個對象,該對象可以是即使該方法的返回類型特徵它作爲不可變可變的。沒有什麼可以阻止聲明的方法返回一個不可變對象,但返回一個類儘管你可以用introspection來確定接收的對象是否實際上是可變的或不可變的,但你不應該總是使用對象的返回類型來判斷它的可變性。來自[Object Mutability](http://bit.ly/mXOexA) – albertamg
謝謝,這是一個很好的參考。 –