2

Ich bin sicher, dass der statische Analysator in diesem Fall wahrscheinlich richtig ist, aber ich verstehe nicht ganz, warum ...Xcode Analyzer meldet Leck mit ARC - Ratschläge zur Lösung?

Hier ist ein Segment von Code aus einer UUID-Klasse:

@interface UUID { 
    CFUUIDRef uuidRef; 
} 
@end 

@implementation UUID 

- (id) initWithString:(NSString*)string { 
    if (string && [NSNull null] != (NSNull*)string) 
     return [self initWithCFUUID:CFUUIDCreateFromString(kCFAllocatorDefault, (__bridge CFStringRef) string)]; 
    else 
     return nil; 
} 

- (id) initWithCFUUID:(CFUUIDRef)uuidRef { 
    if (self = [super init]) { 
     self->uuid = uuidRef; 
    } 
    return self; 
} 
@end 

Xcode hat ein Leck in der "Return" -Zeile in der ersten init gemeldet. Ein Screenshot kann here gefunden werden.

Ich habe ein grundlegendes Verständnis von Bridge, Bridge_retain und Bridge_transfer, aber ich glaube, dass Bridge in diesem Fall die richtige Wahl ist.

Wenn mein Verständnis stimmt, kann jemand beraten, ob ich das falsch mache? Wie würde ich das Problem lösen?

Grüße, Nick

Antwort

1

Sie müssen dealloc zu Ihrer Implementierung hinzuzufügen, und rufen CFRelease auf uuidRef dort:

- (void)dealloc 
{ 
    CFRelease(uuidRef); 
} 
+0

Ich fürchte, ich dies nicht verstehen. Wenn die CFUUIDCreateFromString() - Funktion ein Objekt mit einer Retain-Anzahl von +1 zurückgibt, würde die Freigabe sicher freigeben? Wenn ich das in meinen Code einfüge, stürzt es ab, wie ich es erwarten würde ...? –

+1

In Ihrer 'UUID' Klasse sollte Ihre' -initWithCFUUID: 'Methode die' CFUUIDRef' behalten. Sie sollten auch '-dealloc' überschreiben und dort' CFUUIDRef' freigeben. Dies ist nur die grundlegende Aufbewahrungs-/Freigabekonvention. –

+0

@dark_perfect Ups, ich habe nicht darauf geachtet, wie Sie das 'UUID'-Objekt behalten haben, indem Sie es an die' initWithCFUUID' übergeben haben. Die Zeile "self> uuid = uuidRef;" sollte wahrscheinlich "self> uuidRef = uuidRef;" sein, vorausgesetzt, dass die Deklaration der Schnittstelle korrekt ist (es gibt dort kein 'uuid'-Element). Ich habe meine Antwort durch etwas ersetzt, das funktionieren sollte. – dasblinkenlight

Verwandte Themen