Was ist der richtige Weg, um ein Objekt freizugeben, wenn es auch zurückgegeben werden muss?
Ich tatAnalyze
und bekampotential leak of an object stored into
Warnung in meinem Code unten
+ (ABAddressBookRef)getABAddressBookRef {
unsigned long long lastAddressBookGeneration = _addressBookGeneration;
unsigned long long addressBookGeneration =[[NSThread currentThread].threadDictionary[kAddressBookGeneration] unsignedLongLongValue];
ABAddressBookRef addressBook = (__bridge ABAddressBookRef)[NSThread currentThread].threadDictionary[kAddressBook];
if (addressBook == nil || (addressBookGeneration != lastAddressBookGeneration)) {
if (addressBook) {
if ([NSThread isMainThread]) {
ABAddressBookUnregisterExternalChangeCallback(addressBook,_ExternalChangeCallback, nil);
}
[[NSThread currentThread].threadDictionary removeObjectForKey:kAddressBook];
}
addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
if (addressBook != nil) {
if ([NSThread isMainThread]) {
ABAddressBookRegisterExternalChangeCallback(addressBook,_ExternalChangeCallback, nil);
}
[NSThread currentThread].threadDictionary[kAddressBook] = (__bridge id) addressBook;
[NSThread currentThread].threadDictionary[kAddressBookGeneration] = [NSNumber numberWithUnsignedLongLong:lastAddressBookGeneration];
}
}
return addressBook;
}
Ich sah mich SO um und stellte fest, dass das Problem sein könnteABAddressBookCreateWithOptions(NULL, NULL);
Ich muss wahrscheinlich CFRelease () aufrufen, nachdem ich das aufgerufen habe. Aber dann kam meine nächste Frage: Bei dieser Methode muss ich addressBook zurückgeben. Wie kann ich beides erreichen? 1) Das ABAddressBookRef zurückgeben. 2) CFRelease () richtig aufrufen, damit ich keine Speicherleckwarnung erhalte.
Ergibt das irgendeinen Sinn?
+ (ABAddressBookRef)getABAddressBookRef {
unsigned long long lastAddressBookGeneration = _addressBookGeneration;
unsigned long long addressBookGeneration =[[NSThread currentThread].threadDictionary[kAddressBookGeneration] unsignedLongLongValue];
ABAddressBookRef addressBook = (__bridge ABAddressBookRef)[NSThread currentThread].threadDictionary[kAddressBook];
if (addressBook == nil || (addressBookGeneration != lastAddressBookGeneration)) {
if (addressBook) {
if ([NSThread isMainThread]) {
ABAddressBookUnregisterExternalChangeCallback(addressBook,_ExternalChangeCallback, nil);
}
[[NSThread currentThread].threadDictionary removeObjectForKey:kAddressBook];
}
ABAddressBookRef newAddressBook = ABAddressBookCreateWithOptions(NULL, NULL);
addressBook = newAddressBook;
if (newAddressBook != nil) {
if ([NSThread isMainThread]) {
ABAddressBookRegisterExternalChangeCallback(newAddressBook, _ExternalChangeCallback, nil);
}
[NSThread currentThread].threadDictionary[kAddressBook] = (__bridge id) newAddressBook;
[NSThread currentThread].threadDictionary[kAddressBookGeneration] = [NSNumber numberWithUnsignedLongLong:lastAddressBookGeneration];
CFRelease(newAddressBook);
}
}
return addressBook;
}