W Celu C, dlaczego mogę przypisać NSArray do NSMutableArray bez błędu lub ostrzeżenia?

Niepokoi mnie dziwne zachowanie, które ilustruje następujący przykład:

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]; 

Obieinit iarray metoda obuNSArray iNSMutableArray klasy wracająid. Jednak zachowanie, gdy nazywam te metody, nie jest po prostu takie samo, a clang pozwala mi szczęśliwie przypisać pusteNSArray doNSMutableArray zmienna!

Okazało się, żeclang automatycznie zmieni typ powrotu niektórych metod, w tym metodyinit rodzina, doinstancetypei tym samym być w stanie określić, w czasie kompilacji, że[[NSArray alloc] init] zwracaNSArray * a nieNSMutableArray *. Ale to sprawdzenie po prostu nie działa zarray metoda.

Czemu? Nie powinny generować linii jak mój ostatni przykładprzynajmniej ostrzeżenie? Dlaczego nie wszystkie te metody są deklarowane jako powracająceinstancetype? Czy zmieni się w przyszłości?

Aktualizacja

Dobra wiadomość: od wersji iOS 7,[NSArray array] zwracainstancetype, więc przypisanie doa4 powyżej również daje ostrzeżenie. Inne metody, takie jakarrayWithContentsOfFile: lubarrayWithContentsOfURL wciąż wracamid, chociaż…

questionAnswers(2)

yourAnswerToTheQuestion