Как еще можно избежать утечки этого базового базового объекта? - PullRequest
3 голосов
/ 11 марта 2010

Следующие утечки:

CFStringRef labelName = ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(aMultiRef, indexPath.row));
    cell.textLabel.text = (NSString *)labelName;
    CFRelease(labelName);

Хотите знать, есть ли способ переписать его, чтобы он не протекал без взлома и присвоения ABMultiValueCopyLabelAtIndex(aMultiRef, indexPath.row) для CFStringRef, которое мне потом нужно CFRelease 2 строки вручную? Конечно, ничего страшного в этом нет ... Мне просто любопытно.

Редактировать: Будет ли CFAutoRelease работать? см. мой комментарий ниже

Ответы [ 2 ]

2 голосов
/ 11 марта 2010

Из-за семантики копирования / получения вам необходимо выпустить все, что выходит из API с Copy. ABMultiValueCopyLabelAtIndex соответствует этому требованию, поэтому, к сожалению, вам потребуется приобрести эту ссылку и выпустить ее позже.

0 голосов
/ 03 июня 2013

Вы можете выполнить автоматический выпуск с помощью Objective-C (при условии, что у вас есть бассейн). Просто приведите к идентификатору первым. Например. [(id) labelName autorelease] будет работать нормально, и это совершенно законно (потому что CFStringRef является бесплатным и соединяется с NSString). На самом деле вы можете сделать это с любым типом на основе CoreFoundation, хотя я не верю, что Apple публично документирует это, поэтому теоретически это может измениться.

...