2009-09-08 81 views
3

我想保留一个可变的CGImageRefs集合。我是否需要将它们包装在NSValue中,如果是的话,我如何正确包装和解包它们?我可以逃脱使用C数组吗?如果是的话,我该如何构建它,以后如何添加元素?使用UIImages而不是CGImageRefs作为集合的元素是否成本更高?如何创建CGImageRefs的可变数组?

回答

1

通过image.CGImage获取CGImageRef的UIImage可能是昂贵的。从文档:

如果由于内存限制已清除映像数据,则调用此方法将强制将该数据加载回内存。重新加载图像数据可能会导致性能损失。

如果你觉得舒服混合C++和Objective-C,你可以使用一个的std ::矢量用于存储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 2011-01-02 22:29:37

14

您可以直接添加CGI法师到NSMutableArray。您需要转换为(id)以避免编译器警告。

CFType桥接到NSObject。你可以发送任何NSObject对任何CFType响应的消息。特别是 - 保持和释放正常工作。

+0

我还没有找到任何可以将CFType转换为NSObject的文档,请谨慎操作。更新可能会在未来破坏您的代码。 – 2009-09-08 11:21:01

+2

它应该记录在某个地方。这是支持的。 (-Ken,Cocoa Frameworks) – Ken 2009-09-08 17:43:06

+0

你怎么把它弄出来?当我尝试'CGImageRef img0 = [cgImages objectAtIndex:0];'我得到'从不兼容的指针类型初始化'。 – 2011-04-27 20:21:16

9

2011:万一有人仍然在寻找 可以在NSValues包装CGImageRef使用

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

希望这有助于有人