Angenommen, Sie haben eine Methode, die eine neu generierte NSArray-Instanz zurückgibt, die intern mit einem NSMutableArray erstellt wird. Haben Sie immer etwas tun:Wie vorsichtig sind Sie mit Ihren Rückgabetypen in Objective-C?
- (NSArray *)someArray {
NSMutableArray *mutableArray = [[NSMutableArray new] autorelease];
// do stuff...
return [NSArray arrayWithArray:mutableArray]; // .. or [[mutableArray copy] autorelease]
}
Oder lassen Sie nur die änderbaren Array-Objekt, wie sie ist und es direkt zurück, weil NSMutableArray eine Unterklasse von NSArray ist:
- (NSArray *)someArray {
NSMutableArray *mutableArray = [[NSMutableArray new] autorelease];
// do stuff...
return mutableArray;
}
Ich persönlich oft Verwandle ein veränderbares Array in ein NSArray, wenn ich von solchen Methoden zurückkomme, nur weil ich es irgendwie "sicherer" oder "korrekter" finde. Obwohl ich ehrlich gesagt kein Problem damit hatte, ein veränderbares Array zurückzuschicken, das in ein NSArray umgewandelt wurde, ist es in der Realität wahrscheinlich kein Problem - aber gibt es eine Best Practice für solche Situationen?
stimme ich generell zu. Wenn jedoch die Möglichkeit besteht, dass der aufrufende Code mit dem zurückgegebenen Wert herumfummelt, kann dies ernsthafte Probleme verursachen, dann ist eine defensive Kopie eine gute Idee. Dies gilt insbesondere für den Framework-Code. –
Wenn der aufrufende Code etwas mutiert, was Ihre API als unveränderlich behandelt, sollten sie eine "-mutableCopy" machen. Sonst mache ich es falsch. ;) (Nichts hindert Sie daran, defensiv zu sein, wenn Sie das Gefühl haben müssen.) – Wevah
Das eigentliche Problem besteht jedoch darin, dass der Aufrufer, der ein NSArray * erhält, einen veränderbaren Array-Verweis auf ein Array zurückgeben kann, das später mutiert werden kann gehe davon aus, dass sich der Inhalt nie ändert ... und ... naja ... * BOOM *. – bbum