2011-07-06 121 views
8

如果我想返回一個不可變數組,如+ (NSArray *)ids,但在此方法內部,我聲明NSMutableArray,因爲我想使用-sortUsingSelector:對它進行排序。返回NSMutableArray而不是聲明NSArray的Objective-c返回方法返回類型

返回此方法的工作完美。

  • 但它是「好」編寫的代碼,聲明回報方法應該是同一類型和實際類型是另一個?

  • 請問這是否是因爲NSMutableArrayNSArray的子類?

  • 實際回報值是NSArray還是NSMutableArray

+3

在任何語言中,函數的實際返回類型可以是聲明的返回類型的子類型作爲結果[Liskov替代原則](http://en.wikipedia.org/wiki/Liskov_substitution_principle)。 – outis

回答

6

(...)是「好」編寫的代碼,聲明回報方法應該是一個類型和actualy類型是另一個?

是的,它提供的類型是兼容的;見下一段。事實上,Cocoa中也有一些情況(特別是類集羣)也可以這樣做。

這是因爲NSMutableArray是NSArray的子​​類嗎?

沒錯。由於NSMutableArrayNSArray的子類,因此它繼承了它的所有方法和聲明的屬性,因此它的行爲與NSArray的行爲相同。這被稱爲Liskov substitution principle

實際的返回值是NSArray還是NSM​​utableArray?

返回值是您返回的任何值。由於您要退回NSMutableArray,因此這是NSMutableArray。從調用者的角度來看,它是一個可以像NSArray一樣使用的對象。

+5

從類型爲返回一個'NSArray *'的方法中返回一個可變數組是可以的,但是對於從返回一個'NSArray *'類型的方法中獲取的數組,您可能會發生變化。如果方法的聲明沒有明確說它返回一個可變數組,那麼調用者不應該假定它返回一個可變數組。即使在你自己的應用程序中這樣做意味着你正在使自己的代碼變得更加脆弱。如果該類正在告訴自己的數組進行自我排序,則該方法應該是顯式返回可變的訪問器。任何其他類應該製作自己的可變副本。 –

+0

@Peter Hosey:+1。 Apple文檔明確禁止將對象視爲可變的,如果API將其作爲不可變的*發佈,即使您先測試並發現它是可變的*。 – JeremyP

+1

@Jer [測試可變性並不像最初看起來那麼簡單](http://stackoverflow.com/q/1788690/557219)。 – 2011-07-06 10:45:05

2
  • 無論是「好」還是不好是一個難題。如果它是一個小項目,只有你使用代碼,它可能是好的。但是,如果您依賴於無法更改返回的「NSArray」,則不正常。 (見最後一點)

  • 是的。

  • 這是一個NSMutableArray。一個簡單的演員將讓你改變它的值。

如果你真的想一回不可變對象,請執行下列操作:

NSArray* immutableArray = [[mutableArray copy] autorelease]; 
    return immutableArray; 
+0

當不在GC或ARC下運行時,不要忘記自動釋放它。 –

+0

正確,編輯以反映這一點。 – uvesten