2012-03-25 5 views
1

Ich erhalte die folgende Warnung.Obj-C, Objekt mit Referenzzählung wird verwendet, nachdem es freigegeben wurde?

Referenzzählung Objekt verwendet wird, nachdem es

ARC freigegeben wird, wird für diese Datei aktiviert.

Ich habe meine App nicht zur Verwendung von ARC konvertiert und habe derzeit kein richtiges Verständnis davon. Aber auf einen Blick bin ich verwirrt, warum dieser Code ein Problem haben sollte (aus einer Bibliothek), ich meine, ich weiß, Autorelease sollte hier nicht verwendet werden?

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    id uuid = [defaults objectForKey:@"uniqueID"]; 
    if (uuid) 
     uniqueID = (NSString *)uuid; 
    else { 
     CFStringRef cfUuid = CFUUIDCreateString(NULL, CFUUIDCreate(NULL)); 
     uniqueID = (__bridge NSString *)cfUuid; 
     CFRelease(cfUuid); 
     [defaults setObject:uniqueID forKey:@"uniqueID"]; // warning here 
    } 

EDIT @JohnCalsbeek, @epatel, @Chuck Danke, habe ich versucht, nur, dass ich eine neue Warnung auf CFStringRef cfUuid Linie bekommen, potenziellen Leck sagen.

Heres die vollständige Datei https://github.com/MugunthKumar/MKStoreKit/blob/master/MKSKProduct.m

Antwort

2

Versuchen Sie dieses, srry für die Miss Verständnis haha ​​

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
id uuid = [defaults objectForKey:@"uniqueID"]; 

if (uuid) 
    uniqueID = [NSString stringWithString:(NSString *)uuid]; 
else { 
    CFUUIDRef temp = CFUUIDCreate(NULL); 
    CFStringRef cfUuid = CFUUIDCreateString(NULL, temp); 
    uniqueID = [NSString stringWithString:(__bridge NSString*) cfUuid]; 
    CFRelease(cfUuid); 
    CFRelease(temp); 

    [defaults setObject:uniqueID forKey:@"uniqueID"]; // warning here 
} 
+0

Danke, aber das gibt mir Fehler https://img.skitch.com/20120326-b9692kiegw7xheipj8rgw3y53.jpg – Jules

+0

@Jules Eigentlich habe ich gerade festgestellt, dass dies eine CCFUID-Kennung ist, lassen Sie mich meine Antwort bearbeiten. – Pochi

+0

@Jules hat vergessen, Ihnen zu sagen, mit dem Clang Static Analyzer wird dies sehr einfach zu verstehen. (Sie können es in Ihrem Projekt Debug-Optionen drehen) – Pochi

1

ich glaube, dass diese Linie sein kann, das nicht das, was Sie

uniqueID = (__bridge NSString *)cfUuid; 

erwarten tut Es ist eine einfache Besetzung und die nächste Zeile wird Release tatsächlich sowohl cfUuid und uniqueID (das ist eigentlich das gleiche Objekt).

Also würde ich die Reihenfolge der folgenden Zeilen ändern

[defaults setObject:uniqueID forKey:@"uniqueID"]; // warning here 
CFRelease(cfUuid); 
+0

Danke, aber das hat nicht funktioniert, sehen bearbeiten – Jules

1

Sie mit CFUUIDCreateString(NULL, CFUUIDCreate(NULL) einen String erstellen. Dann weisen Sie uniqueID zu, um auch auf diesen String zu verweisen. Dann geben Sie die Zeichenfolge mit CFRelease(cfUuid) frei. Dann verwenden Sie die Zeichenfolge (wie uniqueID) in der nächsten Zeile. Das ist ungültig, weil Sie es gerade veröffentlicht haben.

+0

Danke, aber das hat nicht funktioniert, sehen bearbeiten – Jules

2

Eine __bridge Umwandlung ist keine Eigentumsübertragung. uniqueID wird keine Eigentümerreferenz und wird daher an der Zeile mit der Warnung ungültig. Sie können entweder __bridge_transfer (das die Eigentumsrechte an die Objective-C-Referenz überträgt) verwenden und Ihren CFRelease-Anruf entfernen oder den Anruf zu CFRelease ändern, um nach dem Anruf zu -setObject:forKey: zu sein.

+0

Danke, aber das didn‘ t arbeiten, siehe bearbeiten – Jules

+0

Haben Sie die '__bridge_transfer' Version versucht? –

Verwandte Themen