2010-11-22 4 views
0

Ich machte eine Unterklasse von NSCell und überschrieb die SetObjectValue-Funktion, um meine Notwendigkeit zu erreichen. Die Dinge sind in Ordnung, außer es gibt ein Leck Problem. Die SetObjectValue-Funktion von NSCell scheint das ursprüngliche Objekt nicht freizugeben.Kakao benutzerdefinierte Zelle in NSTableView: NSCell Subclassing Leck

Das Objekt ich die Klasse geben, ist ein customize Objekt, das mit dem NSCopying Protokoll entsprechen und implementiert, um die copyWithZone Funktion wie unten

- (void)setObjectValue:(id <NSCopying>)object { 

    // I tried to use [[self objectValue] release]; here but the app crashed 

    [super setObjectValue:object]; 

    //---- other iniatizlize here --- 
} 

.

- (id)copyWithZone:(NSZone *)zone { 
    MapComponent *newCopy = [[MapComponent allocWithZone:zone] initWithType:self.componentType]; 
    newCopy.myImage = self.myImage; 
    return newCopy; 
} 

Ich habe das gleiche Problem here gefunden. Es gibt keine Antwort, aber vielleicht beschreibe ich meine Situation besser.

Antwort

2

Try this:

- (id)copyWithZone:(NSZone *)zone { 
    MapComponent *newCopy = [[[MapComponent allocWithZone:zone] initWithType:self.componentType] autorelease]; 
    newCopy.myImage = self.myImage; 
    return newCopy; 
} 
+2

Sie sollten keine 'autorelease' Wert aus einer Kopiermethode zurückzukehren! – Richard

+0

Ein weiteres Problem hier ist, dass Sie den Accessor 'newCopy.myImage' verwenden, der anfänglich den gleichen ** Zeiger-Wert ** hat' self.myImage'. Was Sie tun möchten, ist der direkte Zeigerzugriff: 'newCopy-> myImage = nil; newCopy.myImage = self.myImage; 'Andernfalls wird' newCopy' 'self'' myImage' freigeben, wenn es versucht, eine Kopie davon zu erstellen. – Richard

Verwandte Themen