Ответ 1
Да, в CoreFoundation вам нужно выпустить что-либо с помощью Create или Copy в имени. Вы делаете это с помощью CFRelease(). В вашем случае вы должны освободить как массив, так и ссылки в адресной книге.
Нужно ли мне выделять объекты Core Foundation для очистки памяти? И если да, то как?
Например, в коде:
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef peopleArray = ABAddressBookCopyArrayOfAllPeople(addressBook);
Мне нужно освободить peopleArray
? Что насчет addressBook
?
Да, в CoreFoundation вам нужно выпустить что-либо с помощью Create или Copy в имени. Вы делаете это с помощью CFRelease(). В вашем случае вы должны освободить как массив, так и ссылки в адресной книге.
В вашем примере должны быть освобождены как addressBook
, так и peopleArray
. Поскольку в Core Foundation нет эквивалента autorelease
, если вы возвращаете ссылку из метода, верните массив, не отпуская его. Вы должны (если вы не злитесь), затем включите "create" в имя метода, чтобы указать вызывающему, что теперь у них есть ссылка на возвращенный объект. В этом случае CFArray без сбоев соединяется с мостом NSCFArray
, Objective-C, который наследует от NSObject
. Таким образом, вы можете использовать peopleArray
в NSArray*
и autorelease
, если вам нужно вернуть его из функции/метода:
return [(NSArray*)peopleArray autorelease];
Обратите внимание, что это работает только для бесплатных мостовых классов. Мое понимание заключается в том, что довольно сложно создавать свои собственные бесплатные мостовые классы, а только примитивные (строковые, массивные и т.д.) Классы CF являются бесплатными мостами, поэтому такой подход не будет работать всегда. Наконец, если вы можете избежать использования autorelease
(т.е. Вы можете сделать управление вашей памятью более явным), это, вероятно, всегда хорошо.
Еще одна небольшая точка, о которой никто еще не упомянул, некоторые классы CF имеют "бесплатный мост" со своим NS-партнером. CFString
и NSString
, CFArray
и NSArray
- оба примера. Это актуально, поскольку вы можете просто использовать release
для этих классов.
См. этот fooobar.com/questions/166865/... для получения дополнительной информации.
Я бы предложил прочитать руководство Apple по управлению памятью Core Foundation для всестороннего обсуждения этого вопроса. У них есть аналогичное руководство для общего управления памятью Cocoa.
Чтобы освободить объект CF, вы должны вызвать функцию CFRelease
.
Для ARC вы можете использовать.
return (__bridge_transfer NSArray*)peopleArray;
"__ bridge_transfer" перенесет право собственности на ARC, и поэтому вам не нужен дальнейший выпуск.