Я хочу сохранить изменчивую коллекцию CGImageRefs. Нужно ли обертывать их в NSValue, и если да, то как мне их обернуть и развернуть? Могу ли я уйти с использованием массива C? Если да, то каким образом я могу его создать и как добавить к нему элементы позже? Это значительно более дорогостоящее использование UIImages вместо CGImageRefs в качестве элементов коллекции?Как создать изменяемый массив CGImageRefs?
ответ
Получение CGImageRef из UIImage через image.CGImage может быть дорогостоящим. Из документации:
Если данные изображения были очищены из-за ограничений памяти, вызов этого метода заставляет данные загружаться обратно в память. Перезагрузка данных изображения может привести к снижению производительности.
Если вы чувствуете себя комфортно с перемешивающими C++ и Objective-C, вы можете использовать зЬй :: вектор для хранения CGImageRef. Переименуйте исходный файл из .m в .mm и попробовать это:
#include <vector>
...
CGImageRef i;
...
std::vector<CGImageRef> images;
images.push_back(i);
Если вы хотите сохранить вектор в качестве члена класса Objective-C, вы должны передать его в куче, а не стек:
Заголовочный файл:
#include <vector>
using std;
@interface YourInterface : ...
{
vector<CGImageRef> *images;
}
и в файле реализации:
images = new std::vector<CGImageRef>();
images->push_back(i);
...
//When you're done
delete images;
images = NULL;
Вы можете сразу добавить CGI маг в NSMutableArray. Вам нужно будет указать (id), чтобы избежать предупреждений компилятора.
CFType подключен к NSObject. Вы можете отправить любое сообщение, которое NSObject отвечает на любой тип CFType. В частности, -retain и -release работают как обычно.
Я ничего не нашел в документах, которые вы можете просто передать CFType в NSObject, будьте осторожны, когда вы это сделаете. Обновления могут сломать ваш код в будущем. –
Он должен быть где-то документирован. Это поддерживается. (-Ken, Cocoa Frameworks) – Ken
Как вы это узнаете? Когда я пытаюсь 'CGImageRef img0 = [cgImages objectAtIndex: 0],' I get 'инициализируется из несовместимого типа указателя.' –
2011: только в случае, если кто-то все еще ищет Вы можете обернуть CGImageRef в NSValues с помощью
+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type
отсюда:
CGImageRef cgImage = [self cgImageMethod];
NSValue *cgImageValue = [NSValue valueWithBytes:&cgImage objCType:@encode(CGImageRef)];
[array addObject:cgImageValue];
получить:
CGImageRef retrievedCGImageRef;
[[array objectAtIndex:0] getValue:&retrievedCGImageRef ];
надеюсь, что это помогает кто-то
Это сложнее, чем необходимо - CGImages можно напрямую добавить в NSMutableArray. – Ken