Как еще я могу избежать утечки этого основного объекта фундамента?


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

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

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

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

2 3

2 ответа:

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

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