Как еще я могу избежать утечки этого основного объекта фундамента?
Следующие утечки:
CFStringRef labelName = ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex(aMultiRef, indexPath.row));
cell.textLabel.text = (NSString *)labelName;
CFRelease(labelName);
Интересно, есть ли способ переписать его так, чтобы он не протекал, не вырываясь и не назначая ABMultiValueCopyLabelAtIndex(aMultiRef, indexPath.row)
CFStringRef
, что мне затем нужно вручную CFRelease
2 строки позже? Конечно, это не большое дело, чтобы сделать это...Мне просто любопытно.
Edit: будет ли CFAutoRelease
работать? смотрите мой комментарий ниже
2 ответа:
Из-за семантики Copy/Get вы должны освободить все, что выходит из API с
Copy
в нем.ABMultiValueCopyLabelAtIndex
соответствует этому требованию, поэтому, к сожалению, вам придется приобрести эту ссылку и выпустить ее позже.
Вы можете выполнить авторелиз с помощью Objective-C (если у вас есть пул). Просто сначала приведите к id. Например, [(id)labelName autorelease] будет работать нормально, и это совершенно законно (потому что CFStringRef и бесплатный мост с NSString). На самом деле вы можете сделать это с любым типом, основанным на CoreFoundation, хотя я не верю, что Apple публично документирует это, поэтому теоретически это может измениться.