2009-09-08 4 views
3

Я хочу сохранить изменчивую коллекцию CGImageRefs. Нужно ли обертывать их в NSValue, и если да, то как мне их обернуть и развернуть? Могу ли я уйти с использованием массива C? Если да, то каким образом я могу его создать и как добавить к нему элементы позже? Это значительно более дорогостоящее использование UIImages вместо CGImageRefs в качестве элементов коллекции?Как создать изменяемый массив CGImageRefs?

ответ

1

Получение 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; 
+0

Это сложнее, чем необходимо - CGImages можно напрямую добавить в NSMutableArray. – Ken

14

Вы можете сразу добавить CGI маг в NSMutableArray. Вам нужно будет указать (id), чтобы избежать предупреждений компилятора.

CFType подключен к NSObject. Вы можете отправить любое сообщение, которое NSObject отвечает на любой тип CFType. В частности, -retain и -release работают как обычно.

+0

Я ничего не нашел в документах, которые вы можете просто передать CFType в NSObject, будьте осторожны, когда вы это сделаете. Обновления могут сломать ваш код в будущем. –

+2

Он должен быть где-то документирован. Это поддерживается. (-Ken, Cocoa Frameworks) – Ken

+0

Как вы это узнаете? Когда я пытаюсь 'CGImageRef img0 = [cgImages objectAtIndex: 0],' I get 'инициализируется из несовместимого типа указателя.' –

9

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 ]; 

надеюсь, что это помогает кто-то