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;
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage