2009-08-15 5 views
10

Gibt es einen guten Grund, warum ich sowas nicht machen sollte? Beispiel:Wo ist der Unterschied zwischen [MyClass Alloc] und [[Self Class] Alloc]?

Ich habe eine Klasse MyClass. Dort habe ich diese Umsetzung:

- (id)copyWithZone:(NSZone*)zone { 
    MyClass *copy = [[MyClass allocWithZone:zone] init]; 
    copy.someproperty = [[self.someproperty copy] autorelease]; 
    return copy; 
} 

Statt dessen fand ich ein Snippet, das wie folgt aussieht:

- (id)copyWithZone:(NSZone*)zone { 
    MyClass *copy = [[[self class] allocWithZone:zone] init]; 
    copy.someproperty = [[self.someproperty copy] autorelease]; 
    return copy; 
} 

Der Unterschied ist, dass der erste verwendet nur den Namen, wenn seine eigene Klasse menschlich lesbar, als ob es irgendeine andere Klasse wäre. Und der zweite fragt sich selbst nach welcher Klasse das ist. Macht das einen Unterschied, oder sind beide in diesem Fall völlig in Ordnung?

Antwort

10

Wenn Sie die Klasse MyClass ableiten, gibt das zweite Beispiel -copyWithZone: eine Instanz der Unterklasse zurück. Im ersten Beispiel wird keine Instanz von MyClass zurückgegeben.

+0

Also in einer Klasse, wenn Sie eine Instanz der gleichen Klasse erstellen möchten, sollte man immer [[Selbstklasse] Alloc] anstelle von [TheClass Alloc] aufrufen? –

+0

Es hängt davon ab, ob eine Unterklasse mit dieser Methode umgehen soll. In -copyWithZone: Eine Unterklasse kann Ihre Methode über Super aufrufen, zusätzliche Konfiguration ausführen und dann das Ergebnis zurückgeben. Es ist daher vorzuziehen, [Selbstklasse] zu verwenden. –

+0

eine Unterklasse muss nicht unbedingt über Super aufrufen. Wenn die Unterklasse keine eigenen zusätzlichen Variablen besitzt, kann sie sie ohne zusätzliche Arbeit erben – user102008

Verwandte Themen