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
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 ...? –
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. –
@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