How do I create a mutable array of CGImageRefs?

大兔子大兔子 提交于 2019-11-28 09:35:08

问题


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:


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;



回答2:


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.




回答3:


2011: just in case someone's still looking You can wrap CGImageRef in NSValues by using

+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type

hence:

CGImageRef cgImage = [self cgImageMethod];
NSValue *cgImageValue = [NSValue valueWithBytes:&cgImage objCType:@encode(CGImageRef)];
[array addObject:cgImageValue];

to retrieve:

CGImageRef retrievedCGImageRef;
[[array objectAtIndex:0] getValue:&retrievedCGImageRef ];

hope this helps somebody



来源:https://stackoverflow.com/questions/1392321/how-do-i-create-a-mutable-array-of-cgimagerefs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!