假設你有一個方法返回一個新生成的NSArray實例,它內部構建了一個NSMutableArray。你總是做這樣的事情:您在Objective-C中的返回類型有多小心?
- (NSArray *)someArray {
NSMutableArray *mutableArray = [[NSMutableArray new] autorelease];
// do stuff...
return [NSArray arrayWithArray:mutableArray]; // .. or [[mutableArray copy] autorelease]
}
或者你只是離開了可變數組對象,是直接返回,因爲NSMutableArray的是NSArray中的一個子類:
- (NSArray *)someArray {
NSMutableArray *mutableArray = [[NSMutableArray new] autorelease];
// do stuff...
return mutableArray;
}
就個人而言,我經常當我從這樣的方法返回時,將一個可變數組變成一個NSArray只是因爲我覺得它以某種方式「更安全」或更「正確」。儘管說實話,我從來沒有遇到過將一個可變數組轉換爲NSArray的問題,所以這可能是一個非現實問題 - 但是對於這種情況,是否有最佳做法?
我普遍同意。但是,如果調用代碼與返回值混淆的可能性會導致嚴重問題,那麼防禦性複製是一個好主意。對於框架代碼尤其如此。 –
如果調用代碼正在改變你的API所說的應該被視爲不可變的東西,他們應該做一個'-mutableCopy'。否則,做錯了。 ;)(沒有什麼是被防守阻止你,如果你覺得你必須,雖然) – Wevah
真正的問題,雖然是如果你返回一個可變數組引用數組以後可能發生突變,主叫方接收一個NSArray *可能假設內容永遠不會改變......並且......好吧...... * BOOM *。 – bbum