jestem zaniepokojony dziwnym zachowaniem, ilustruje następujący przykład:W Objective C, dlaczego wolno mi przypisać NSArray do NSMutableArray bez błędu lub ostrzeżenia?
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];
Zarówno init
i array
metoda obu klas NSArray
i NSMutableArray
powrócić id
. Jednak zachowanie podczas wywoływania tych metod nie jest po prostu takie samo, a clang pozwala mi szczęśliwie przypisać pustą NSArray
do zmiennej NSMutableArray
!
Okazuje się, że clang will automatically change the return type of some methods, including the init
family, to instancetype
, a tym samym być w stanie określić w czasie kompilacji, które [[NSArray alloc] init]
zwraca NSArray *
a nie NSMutableArray *
. Ale ta kontrola po prostu nie działa z metodą array
.
Dlaczego? Czy linie, takie jak mój ostatni przykład, nie powinny generować co najmniej ostrzeżenia? Dlaczego wszystkie te metody nie są zadeklarowane jako zwracające instancetype
? Czy zmieni się w przyszłości?
Aktualizacja
Dobra wiadomość: jak iOS 7 [NSArray array]
zwrotów instancetype
, więc przypisanie do a4
powyżej daje również ostrzeżenie. Inne metody, takie jak arrayWithContentsOfFile:
lub arrayWithContentsOfURL
jeszcze powrócić id
, choć ...
+1 Dobre pytanie. –
Zgłaszałbym błąd na http://bugreport.apple.com i wymieniam tutaj numer błędu. – ericg
@ericgorr jest problem, to nie jest błąd. – CodaFi