Warum darf ich in Ziel C ein NSArray einem NSMutableArray ohne Fehler oder Warnung zuweisen?
Ich bin durch ein seltsames Verhalten gestört, wie das folgende Beispiel zeigt:
NSMutableArray *a1 = [[NSMutableArray alloc] init]; // fine
NSMutableArray *a2 = [NSMutableArray array]; // fine, too
// compiler reports incompatible pointer types; good:
NSMutableArray *a3 = [[NSArray alloc] init];
// compiler says nothing and is happy to assign this!
NSMutableArray *a4 = [NSArray array];
Beideinit
undarray
Methode der beidenNSArray
undNSMutableArray
Klassen kehren zurückid
. Das Verhalten beim Aufrufen dieser Methoden ist jedoch einfach nicht dasselbe, und clang lässt mich glücklich ein Leerzeichen zuweisenNSArray
zu einemNSMutableArray
Variable!
Es stellt sich heraus, dassclang ändert automatisch den Rückgabetyp einiger Methoden, einschließlich derinit
Familie, zuinstancetype
und somit in der Lage sein, zum Kompilierzeitpunkt festzustellen, dass[[NSArray alloc] init]
gibt ein zurückNSArray *
und nicht einNSMutableArray *
. Aber diese Prüfung funktioniert einfach nicht mit derarray
Methode.
Warum? Sollte nicht Linien wie mein letztes Beispiel erzeugenwenigstens eine Warnung? Warum werden nicht alle diese Methoden als "return" deklariert?instancetype
? Wird sich das in Zukunft ändern?
Aktualisieren
Gute Nachricht: ab iOS 7[NSArray array]
kehrt zurückinstancetype
, also die Zuordnung zua4
oben ergibt sich auch eine Warnung. Andere Methoden wiearrayWithContentsOfFile:
oderarrayWithContentsOfURL
kehre immer noch zurückid
obwohl ...