2013-10-07 2 views
2

У меня есть метод, который создает ABRecordRef, устанавливает его свойства и возвращает ref.CFAutoRelease() -подобное поведение на iOS6

Я столкнулся с крахом, когда использую CFAutoRelease, потому что мне нужно поддерживать iOS < 7. Как бы я пошел, чтобы правильно это освободить?

-(ABRecordRef) myRecord{ 
ABRecordRef newRecord = ABPersonCreate(); 
//some setting here 
return CFAutoRelease(newRecord); //how to release here? 
} 
+1

Нет «CFAutoRelease». –

+3

Очевидно, что в 10.9 и iOS 7. (я тоже не знал). – Wevah

+0

TIL. Он еще не задокументирован, но он упоминается в iOS 7 API diff: https://developer.apple.com/library/ios/releasenotes/General/iOS70APIDiffs/ –

ответ

4

Для справки CoreFoundation, я на самом деле было бы не выпустить эту ссылку в вашем методе myRecord. Вместо этого я бы определил интерфейс таким образом, чтобы вызывающий абонент myRecord владел ссылкой и несет ответственность за его освобождение.

+3

Обязательно укажите метод правильно. В этом случае это должно быть что-то вроде 'newRecord'. Начиная с 'new', вы даете понять, что объект имеет сохранение, которое должно быть сбалансировано. –

+2

Это правда, вы должны попытаться следовать «Создать правило» при работе с CoreFoundation. Я бы назвал метод 'CreateRecord 'или' myRecordCreate '. Вот ссылка на политику собственности CoreFoundation, в которой содержится больше информации, в том числе «Создать правило». https://developer.apple.com/library/mac/documentation/corefoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html –

+0

Возможно, вы сможете отправить на 'id' и называть' -autorelease' на нем. (Здесь есть еще один вопрос, как принятый ответ.) – Wevah

2

Вы должны быть в состоянии построить собственную функцию autorelease для объектов ядра фонда, как это:

inline CFTypeRef MyAutorelease(CFTypeRef obj) { 
    id __autoreleasing result = CFBridgingRelease(obj); 
    return (__bridge CFTypeRef)result; 
} 

С __autoreleasing, вы заставляете объект в конечном итоге в autorelease бассейне.

+0

Майк Эш, как всегда, показал путь. – uchuugaka

+0

Собственно, способ, которым показал Майк, не использует '__autoreleasing'. Приведенный выше код проистекает из моего комментария к его сообщению в блоге. –

+0

Ах. Наверное, ты написал после того, как я прочитал его. У вас и у него разные стили. Ваш следующий вопрос является хорошим – uchuugaka

Смежные вопросы