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, doinstancetype
i 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ż…