views:

370

answers:

2

I want to keep a mutable collection of CGImageRefs. Do I need to wrap them in NSValue, and if so how do I wrap and unwrap them properly? Can I get away with using a C array? If so how do I construct it and how do I add elements to it later? Is it significantly more costly to use UIImages instead of CGImageRefs as the elements of the collection?

+1  A: 

Getting the CGImageRef out of an UIImage via image.CGImage can be costly. From the documentation:

If the image data has been purged because of memory constraints, invoking this method forces that data to be loaded back into memory. Reloading the image data may incur a performance penalty.

If you feel comfortable with mixing C++ and Objective-C, you can use a std::vector for storing the CGImageRef. Rename your source file from .m to .mm and try this:

#include <vector>
...
CGImageRef i;
...
std::vector<CGImageRef> images;
images.push_back(i);

If you want to keep the vector as a member of a Objective-C class, you should allocate it on the heap, not the stack:

Header file:

#include <vector>
using std;

@interface YourInterface : ...
{
   vector<CGImageRef> *images;
}

and in the implementation file:

images = new std::vector<CGImageRef>();
images->push_back(i);
...
//When you're done
delete images;
images = NULL;
racha
+2  A: 

You can directly add CGImage to NSMutableArray. You will need to cast to (id) to avoid compiler warnings.

CFType is bridged to NSObject. You can send any message NSObject responds to to any CFType. In particular, -retain and -release work as normal.

Ken
I haven't found anything that documents that you can just cast CFType to NSObject, be careful when you do this. Updates could break your code in the future.
Georg
It should be documented somewhere. This is supported. (-Ken, Cocoa Frameworks)
Ken