Für die Kompilierung mithilfe der Eigenschaftensyntax muss der Typ des Empfängers zur Kompilierungszeit bekannt sein. Ich verstehe vielleicht etwas nicht, aber das scheint eine kaputte oder unvollständige Compiler-Implementierung zu sein, wenn man bedenkt, dass Objective-C eine dynamische Sprache ist.Warum erfordern Eigenschaften explizite Typisierung während der Kompilierung?
@property (nonatomic, retain) NSString *comment;
und mit synthetisiert:
"Dokument" ist ein Beispiel für eine von mehreren Klassen, die zu entsprechen:
Die Eigenschaft "Kommentar" wird mit definierten
@protocol DocumentComment <NSObject>
@property (nonatomic, retain) NSString *comment;
@end
und wird einfach wie folgt deklariert:
id document;
Wenn folgende Eigenschaftssyntax:
stringObject = document.comment;
die folgenden Fehler von gcc erzeugt wird:
error: request for member 'comment' in something not a structure or union
jedoch die folgende äquivalente empfänger Methode Syntax, kompiliert ohne Warnung oder Fehler und Funktioniert wie erwartet zur Laufzeit:
stringObject = [document comment];
Ich verstehe nicht, warum Eigenschaften erfordern, dass der Typ des Empfängers zur Kompilierzeit bekannt ist. Gibt es etwas, das mir fehlt? Ich benutze einfach die letztere Syntax, um den Fehler in Situationen zu vermeiden, in denen das empfangende Objekt einen dynamischen Typ hat. Eigenschaften scheinen halb gebacken.
Aber zur Laufzeit weiß es nicht den eigentlichen Typ des Dokuments, aber es ist immer noch erfolgreich mit Standard-Empfänger-Methode-Syntax. Dies ist eine dynamische Sprache. Natürlich werden die Eigenschaften von document.comment mit der von Ihnen bereitgestellten Property-Deklaration fehlschlagen, was durchaus sinnvoll ist.Der Compiler hat den gleichen Mangel an Informationen in der Empfänger-Methode Syntax Beispiel, aber der Compiler ließ es gehen. Sie können einen nicht existierenden Methodennamen verwenden und der Compiler wird ihn auch loslassen. – ctpenrose
Die Kompilierung akzeptiert nur '[Dokumentenkommentar]' ohne Beschwerde, wenn sie weiß, dass irgendwo eine Methode namens -comment für ein Objekt existiert. Wenn Sie '[Dokument sdlkjf]' eingeben, erhalten Sie stattdessen eine Warnung. Aber Sie haben Recht, Methoden verwenden dynamische Dispatch und werden nur zur Laufzeit fehlschlagen, wenn das Objekt nicht tatsächlich diese Nachricht behandelt. Auf der anderen Seite sind Eigenschaften ein Kompilierzeitmerkmal und der Eigenschaftszugriff wird daher zur Kompilierzeit aufgelöst. –
... und wenn es drei 'comment'-Methoden gibt, eine, die' NSString * 'zurückgibt, eine' char * '- und eine, die eine Struktur zurückgibt, ist die Dynamik sowieso aus dem Fenster. Die Realität ist, dass Objective-C sehr viel eine statisch typisierte Sprache ist, ohne dass diese statische Typisierung sowohl dem dynamischen Dispatch als auch dem Polymorphismus im Wege steht. – bbum