2009-03-30 8 views
0

Angenommen, ich habe eine Klasse wie folgt:In copyWithZone: sollte ich Zone für alle Zuordnungen oder nur für das zurückgegebene Objekt verwenden?

@interface SomeClass : NSObject<NSCopying> { 
    SomeOtherClass *obj; 
} 

In der Definition von copyWithZone :, Ich tue dies:

SomeClass *someCopy = [[SomeClass allocWithZone:zone] init]; 

Also meine Frage ist, wenn ich möchte eine Kopie von obj machen, Welche davon ist richtig/empfohlen?

Option A:

objCopy = [obj copyWithZone:zone]; 

Option B:

objCopy = [obj copy]; 
+0

Oder Option C: objCopy = [obj copyWithZone: [Selbstzone]]; Damit wird die Kopie in der gleichen Zone wie der Anrufer zugeordnet. Aber das ist wiederum, wenn Sie Zonen in erster Linie verwenden. – adib

Antwort

3

Wenn Sie mit Referenzzählung Speicherverwaltung verwenden (nicht Garbage Collection) Sie sollten [obj copyWithZone:zone] verwenden. Außerdem sollten Sie (unter den gleichen Umständen) +allocWithZone: anstelle von +alloc verwenden, um die Kopien zuzuordnen. Dadurch wird Speicher für die Instanzen in einer angegebenen Speicherzone zugewiesen (siehe NSZone). Entwickler verwenden möglicherweise eine separate Zone, wenn sie viele Objekte zuweisen, die ungefähr zur gleichen Zeit nicht mehr benötigt werden. Die gesamte Zone kann dann in einem Vorgang mit zurückgefordert werden, was dazu beiträgt, eine Speicherfragmentierung zu verhindern. Im Allgemeinen wird die Verwendung einer privaten Zone nicht benötigt (und wird die Leistung generell beeinträchtigen; profilieren Sie Ihren Code!). Vorausgesetzt, der Entwickler möchte eine Kopie in einer bestimmten Zone, denke ich, dass Sie davon ausgehen, dass alle zugehörigen Instanzen in derselben Zone sein sollen.

Die Methoden -copy und +alloc rufen die Methoden -copyWithZone: bzw. +allocWithZone: auf und übergeben die Standardzone.

+0

Gibt es einen besonderen Grund - was passiert unter der Haube? –

+0

Eine Zone ist ein Bereich, aus dem Sie Speicher zuweisen. Die Idee ist, dass Sie eine ganze Reihe zusammenhängender Zuordnungen (Cocoa-Objekte, Puffer usw.) aus einer Zone erstellen und dann die Zone statt aller darin enthaltenen Objekte freigeben können. In der Praxis, ich höre, das bringt dir nicht wirklich viel. –

Verwandte Themen