Освобождение ссылок на основные объекты Фонда
Нужно ли освободить объекты Core Foundation для очистки памяти? И если да, то как?
Например, в коде:
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef peopleArray = ABAddressBookCopyArrayOfAllPeople(addressBook);
Нужно ли мне освободить peopleArray
? А как насчет addressBook
?
5 ответов:
Да, в CoreFoundation вы должны выпустить что-либо с Create или Copy в имени. Вы делаете это с помощью CFRelease (). В вашем случае вы должны освободить как массив, так и ссылки на адресную книгу.
- Если вы создаете объект (либо непосредственно или сделав копию еще один объект-см. раздел " Создание Правило"), вы владеете им.
- Если вы получите объект откуда-то еще, вы делаете не владеть им. Если вы хотите предотвратить это будучи утилизированы, вы должны добавить себя как собственника (используя CFRetain).
- Если вы являетесь владельцем объект, вы должны отказаться от собственности когда вы закончите его использовать (используя CFRelease).
В вашем примере, и
addressBook
, иpeopleArray
должны быть освобождены. Поскольку в Core Foundation нет эквивалентаautorelease
, Если вы возвращаете ссылку a из метода, верните массив без его освобождения. Вы должны (если только вы не злой) затем включить "create" в имя метода, чтобы указать вызывающему, что они теперь владеют ссылкой на возвращаемый объект. В этом случае CFArray является бесплатным мостом кNSCFArray
, объекту Objective-C, который наследует отNSObject
. Таким образом, вы можете броситьpeopleArray
вNSArray*
иautorelease
что, если вам нужно вернуть его из функции / метода:Обратите внимание, что это работает только для бесплатных мостовых классов. Я понимаю, что довольно сложно сделать свои собственные бесплатные мостовые классы и только примитивные (string, array и т. д.) Классы CF являются бесплатными мостами, поэтому такой подход не всегда будет работать. Наконец, если вы можете избежать использованияreturn [(NSArray*)peopleArray autorelease];
autorelease
(то есть вы можете сделать управление памятью более явным), это, вероятно, всегда хорошо.
Еще один маленький момент, о котором никто еще не упоминал, некоторые классы CF имеют "бесплатный мост" со своим аналогом NS.
CFString
иNSString
,CFArray
иNSArray
- это оба примера. Это актуально, поскольку вы можете просто использоватьrelease
с этими классами.Смотрите этот другой вопрос StackOverflow для получения дополнительной информации.