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, zuinstancetypeund 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ückidobwohl ...

Antworten auf die Frage(2)

Ihre Antwort auf die Frage