2014-04-04 13 views
11

Udawaj, mam kategorię na NSObject który definiuje następujące metody:Dlaczego nie można stosować składni punktowej dla metody, której typem powrotu jest instancetype?

+ (instancetype)allocTemplate 
{ 
    id instance = [self new]; 

    return instance; 
} 

i mam następujące klasy:

@interface FDActor : NSObject 

@property (nonatomic, copy) NSString *name; 

+ (void)sayHi;  

@end 


@implementation FDActor 

+ (void)sayHi 
{ 
    [self allocTemplate].name; 
} 

@end 

[self allocTemplate].name błędy Jak to się stało się w czasie kompilacji, jeśli ja jest FDActor?

Wiem, że działa, jeśli używasz normalnej składni wysyłania komunikatów, ale jestem wyraźnie zainteresowany błędem składni kropki.

+0

Jaki jest błąd? Próbowałem czegoś podobnego, a moje skompilowałem. –

+0

Nie znaleziono nazwy obiektu na obiekcie typu "id". Dla jasności nie mam na myśli zastąpienia "ja" przez "FDActor". Mam na myśli wywołanie tej metody wewnątrz metody klasy wewnątrz FDActor. –

+0

Jeśli kategoria jest włączona w obiekcie NSObject, to czy instancetype nie powróciłby do typu NSObject? – michaels

Odpowiedz

3

Wyglądałoby to tak, jakby instancetype był używany tylko do sprawdzania typu podczas przypisywania, więc FDActor *actor = [FDActor allocTemplate] nie generuje ostrzeżenia.

Jeśli rzucimy typ zwracania allocTemplate, problem znika.

- (void)sayHi { ((__typeof__(self))[[self class] allocTemplate]).name; }

Należy jednak pamiętać, że to działa tylko w metodzie razem od typeof instancją jest kolejnym przykładem. Zauważ również, że skoro teraz jawnie wpisujemy wartość zwracaną, metoda allocTemplate nie jest już potrzebna, jeśli wszyscy szukali to sprawdzanie typu, to możemy nawet rzucić zero i to zadziała.

Jeśli spróbujemy to samo w metodzie klasy nie działa

+ (void)sayHi { ((__typeof__(self) *)[self allocTemplate]).name; } To dlatego (__typeof__(self) *) czyn nie ocenia się FDActor * ale Class * który ARC będzie narzekać. Wygląda na to, że nie ma sposobu, aby rozwiązać typ informacji FDActor * w sposób ogólny z poziomu metody klasy w czasie kompilacji.

Raczej oczekiwałem, że słowo kluczowe instancetype będzie trochę bardziej użyteczne.

1

Ten komunikat o błędzie informuje. [self allocTemplate] to id. Składnia właściwości nigdy działa na id.

Zauważ, że ten robi pracy:

[FDActor allocTemplate].name; 

Myślę, że klasa, do której instancetype ma być związane muszą być określone w zaproszeniu; w przeciwnym razie po prostu spadamy na id.

+0

Rozumiem to, ale jaki jest sens to jest instancetype? –

+0

http://nshipster.com/instancetype/ – matt

+1

Niestety, nie miałem na myśli tego, że nie wiem, jaki jest typ instancji. Chodzi mi o to, co jest punktem instancetype, jeśli jest traktowane jako identyfikator dla wszystkich metod lub właściwości składni kropek wywołanych na nim. Cały punkt typu instancetype jest taki, że jest rozpoznawany jako typ jakiejkolwiek klasy zwanej metodą. Chcę sprawdzanie typów wywołań metod nie tylko przydziałów. –

0

Dołożę do tego uszczerbku, z zastrzeżeniem, że nie rozumiem w pełni, w jaki sposób obsługuje się wsparcie instancetype, nie mówiąc już o wszystkich drobiazgowych szczegółach systemu sprawdzania typu kompilatora. Innymi słowy, to jest moje najlepsze przypuszczenie, a nie autorytatywna lub pełna odpowiedź ...

Po kompilacji metody Objective-C są w rzeczywistości funkcjami, gdzie self jest pierwszym argumentem funkcji i jest wpisane jako id. Więc trzeba: leczenie

void sayHi(id self, SEL _cmd) 
{ 
    [self allocTemplate].name; // Actually calls to objc_msgSend, but that doesn't matter here 
} 

kompilator jest od typu wartości zwracanej przez +allocTemplate tutaj wydaje się być związane z tym. Jeśli zmienisz się na jawny FDActor, błąd zniknie. Oczywiście dla metod - w przeciwieństwie do właściwości - kompilator typów self, jak można się spodziewać, i ostrzega (lub błąd pod ARC) dla metod, na które samo wydaje się nie reagować. Wygląda na to, że może to być różnica (błąd?) W sprawdzaniu przez kompilator dostępnych metod względem właściwości w kontekście instancetype.

Powiązane problemy