Как хранить CGGradientRef в NSMutableArray - PullRequest
6 голосов
/ 22 ноября 2010

У меня проблема с задачей хранения CGGradientRef в NSMutableArray.Что я должен обернуть это, чтобы сохранить это в массиве и что развернуть это.

Спасибо.

1 Ответ

12 голосов
/ 22 ноября 2010

Вам не нужно ничего оборачивать. Просто приведите его к 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...