Освобождение NSArray не связанных с мостом объектов - PullRequest
1 голос
/ 22 октября 2011

Я пытаюсь управлять списком цепочек для ключей в моем приложении.Я получаю список цепочек для ключей, как это:

// _keychains is an instance variable in AppDelegate
_keychains = [NSArray array];
SecKeychainCopySearchList((CFArrayRef *)&_keychains);

Так что в основном я получаю CFArrayRef и преобразовываю его в NSArray.Теперь мой вопрос: как освобождаются объекты ref цепочки для ключей (непрозрачные структуры)?Нужно ли конвертировать NSArray в CFArrayRef и использовать CFRelease (согласно документации), или можно объективно освободить память?

Ответы [ 2 ]

2 голосов
/ 22 октября 2011

Вы должны просто иметь возможность вызвать release в массиве.release освободит массив и освободит содержимое, как в Какао.

В этом случае не возникает вопроса, как выпустить CF / NS-Array, и вам не нужно беспокоиться овремя жизни элементов до освобождения контейнера.

Даже если отправка от SecKeychainRef до CFRelease была незаконной, вы все равно должны ожидать, что это сработает, потому что система должна делать правильные вещи.API-интерфейсы сбора и распределения CoreFoundation обеспечивают достаточный контроль над обратными вызовами распределителя и хранилища, поэтому инфраструктура безопасности должна делать правильные вещи даже в случае , когда содержимое массива не было совместимо с поведением по умолчанию (в данном случае CFRelease)).Они могли бы предоставить свои собственные обратные вызовы и распределители.Поскольку я не вижу документации, в которой говорится об очевидном отклонении от поведения по умолчанию, я предполагаю, что безопасно вызывать release для массива и что элементы либо совместимы с процедурами подсчета ссылок CF, либо что коллекция использует собственный распределительи / или схема обратного вызова (предоставляемая Security) и будет очищать элементы по мере необходимости (я думаю, что первый).

1 голос
/ 22 октября 2011

Вы можете просто сделать [_keychains release], когда закончите с _keychains. Объект _keychains отправит сообщение release каждому из своих элементов, когда _keychains освобожден.

...