Warum ist "self = [[Rectangle alloc] init]" in einer Klassenmethode BAD?

8

Im Dokument "Objective-C Programmiersprache" von Apple, Seite 48 heißt es:

%Vor%

Einer ist schlecht, einer ist gut und der andere ist ausgezeichnet. Warum ist das so?

    
Proton 15.03.2013, 15:50
quelle

3 Antworten

18

Es gibt ein viertes Muster ....

(1) Typ Mismatch ist schlecht.

(2) Der statische Verweis auf die Klasse liefert eine Methode, die sich in Unterklassen nicht richtig verhält.

(3) dynamischer Verweis auf Klasse bedeutet, dass Unterklassen als Unterklasseninstanzen instanziiert werden

(4)

%Vor%

llvm hat das Schlüsselwort instancetype hinzugefügt, das besagt: "yo! Diese Methode gibt eine Instanz der Klasse zurück, die sie aufgerufen hat". Wenn Sie also die obigen Informationen ableiten, könnten Sie:

%Vor%

Aber das würde warnen (jenseits der schrecklichen Farbwahl):

%Vor%

Während der Rückgabetyp (id) im zweiten Fall nicht warnt.

Beachten Sie, dass ich auch deklariert newInstance explizit vom Typ Rectangle* geschaltet habe. Dies ist auch besser, da im Kontext dieser Methode newInstance nur sicher als Rectangle* behandelt werden kann.

    
bbum 15.03.2013 16:13
quelle
9
%Vor%

In der Klassenmethode self bezieht sich auf die Klasse, nicht auf ein Instanzobjekt.

%Vor%

Wenn das Rechteck unterklassifiziert würde (MyFancyRectangle), würde dies immer noch ein einfaches Rectangle-Objekt zurückgeben, während

%Vor%

würde ein MyFancyReactangle zurückgeben, wenn es wie MyFancyReactangle *r = [MyFancyReactangle rectangleOfColor:[UIColor redColor]] aufgerufen wird, da [self alloc] für die Unterklasse aufgerufen wird. Beachten Sie, dass hier self erneut für die Klasse aufgerufen wird, da +alloc eine Klassenmethode ist.

Aus demselben Grund sollten alle Methoden init… und bequeme Creator id zurückgeben. Es erlaubt Unterklassen, untergeordnete Objekte zurückzugeben, ohne dass der Compiler verrückt wird.

    
vikingosegundo 15.03.2013 15:59
quelle
6

Im ersten Fall weisen Sie den self -Zeiger (der auf das Rectangle -Klassenobjekt verweisen sollte) einer Instanz von Rectangle zu. Das ist absolut falsch.

In der zweiten Klasse programmieren Sie eine Klasse instanziieren - Rectangle in diesem Fall.

In der dritten Klasse erlauben Sie der Klasse, die Klasse der Instanz zu bestimmen, anstatt sie explizit im Code anzugeben. Wenn Ihre Dodecahedron -Klasse denselben Code verwenden muss, muss der Klassenname nicht geändert werden.

    
Carl Veazey 15.03.2013 15:56
quelle

Tags und Links