Вам не нужно ничего оборачивать. Просто приведите его к id
и добавьте в массив. Вы можете сделать это для любого типа CoreFoundation, полученного из CFType (почти все, заканчивающееся на «Ref»).
В качестве альтернативы вы можете привести NSMutableArray * к CFMutableArrayRef и вызвать CFArrayAppendValue (). Это больше не безопасно; он вызывает обратные вызовы retain / release, указанные при создании массива. (Заметным исключением является - [NSDictionary setValue: forKey:], который копирует ключи, в то время как соответствующая функция CFDictionary не копирует. Иногда полезно иметь словарь с ключами «изменяемого» объекта (например, NSURLConnection, с данными-так) - как значения); вы в безопасности, если не нарушаете требование, что хэш не изменяется.)
Типы CoreFoundation являются OO-подобными типами, которые можно использовать в «простом» C. Использование некоторого умного волшебства (Apple может сделать это, потому что они пишут как CF, так и ObjC runtime), экземпляры таких типов, как NSString, NSArray и NSDictionary являются (по умолчанию) «действительно» экземплярами CFString, CFArray и CFDictionary. Типы CF находятся в иерархии типов, корнем которой является CFType ; Известными методами являются CFRetain, CFRelease, CFEqual, CFHash и CFCopyDescription. Они слабо соответствуют -retain, -release, -isEqual :, -hash и -description (за исключением того, что -description дополнительно автоматически выпускается, и они по-разному обрабатывают NULL / nil). Apple называет это «бесплатными мостами» или «взаимозаменяемыми типами данных» (хотя статьи о IDT больше нет в Mac Dev Center). У Ridiculousfish есть хорошая статья под названием "Мост" .
Это означает, что вы можете, по большей части, обрабатывать типы CF, как если бы они были объектами Objective-C. Apple не сделала это особенно очевидным, но в дополнение ко всем упоминаниям о «бесплатном мостовом соединении», есть некоторые вещи, которые предполагают, что они взаимозаменяемы.
- NSMakeCollectable () принимает CFTypeRef и возвращает идентификатор (и включает сборку мусора, которая не имеет отношения к iOS, но очень важна для Mac OS 10.5+).
- Материал наподобие
@property (nonatomic, retain) __attribute__((NSObject)) ABAddressBookRef foo;
, что фактически означает «отправить его-сохранить и-отпустить, как если бы это был экземпляр Objective-C».
- Свойство CALayer.contents имеет тип
id
, но единственная документированная вещь, которую он поддерживает, это CGImageRef (он также поддерживает CABackingStore, то есть то, к чему -drawRect: обращается в).
Дополнительные забавные вещи, которые вы можете сделать, включая определение CFAutorelease .