Objective-C Rückgabetypen: "- (id) init" vs "- (Klassenname *) init"

8

Ich habe dieses Anfänger-Tutorial Ссылка verfolgt , und ich hatte eine Frage bezüglich dieser Klasse und ihrer Implementierung hier:

%Vor% %Vor%

Ich betrachte diesen Initialisierer:

%Vor%

Anstatt es so zu schreiben, könnte ich es auch so schreiben:

%Vor%

Kann mir jemand den Unterschied sagen? Oder, wenn es nicht wirklich wichtig ist?

    
Heisenberg 22.08.2014, 20:42
quelle

3 Antworten

12

Bei der Rückgabe von id anstelle der Klasse handelt es sich um eine Konvention in Objective-C, mit der Unterklassen diesen Initialisierer überschreiben und ihren Typ zurückgeben können. Zum Beispiel lieferte die array -Klassenmethode für NSArray für lange Zeit id , so dass NSMutableArray diese Methode überschreiben und ein veränderbares Array zurückgeben konnte, so dass beides möglich war:

%Vor%

Das Problem dabei war, dass Sie auch sagen können:

%Vor%

und das würde typecheck. Apple hat instancetype als neuen Rückgabetyp eingeführt, der die Klasse zurückgibt, in der die instancetype -Deklaration verwendet wird. Heute gibt die array -Methode instancetype zurück, so dass die ersten 2 Beispiele oben typecheck, aber das schlechte Beispiel nicht checkcheck.

Weitere Details finden Sie im NSHipster-Artikel zum Thema .

    
MaxGabriel 22.08.2014, 20:51
quelle
4

In diesen Szenarien ist der empfohlene Rückgabetyp instancetype . Dies wird in Dokumentation .

    
quellish 22.08.2014 20:47
quelle
0

Ich glaube nicht, dass es einen Vorteil gibt, abgesehen davon, dass ich eine Initialisierungsmethode wiederverwenden kann (damit meine ich Kopieren / Einfügen), ohne den Rückgabetyp ändern zu müssen.

Es ist eigentlich eine schlechte Methode, die ID tatsächlich zu verwenden, da es keine Kompilierzeitprüfung mit dem ID-Rückgabetyp gibt. Die Konvention besteht darin, instancetype anstelle von id (oder dem Klassennamen) zu verwenden, da es die Vorteile von beiden hat.

    
Harold BOULEY 22.08.2014 20:48
quelle

Tags und Links