如何创建一个可变的CGImageRefs数组?

4

我想要保留一个可变的CGImageRefs集合。我需要将它们包装在NSValue中吗?如果需要,如何正确地包装和解包它们?我能否使用C数组?如果可以,那么如何构造它,以及如何稍后添加元素?使用UIImages代替CGImageRefs作为集合元素是否显著增加了成本?

3个回答

13

2011年提示:如果还有人在寻找解决方法,您可以使用NSValue将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 ];

希望这能对某些人有所帮助


13

您可以直接将CGImage添加到NSMutableArray中。为了避免编译器警告,您需要将其转换为(id)。

CFType被桥接到NSObject。您可以向任何CFType发送NSObject响应的任何消息。特别地,-retain和-release工作正常。


我没有找到任何文件说明可以将CFType直接转换为NSObject,当你这样做时要小心。未来的更新可能会破坏你的代码。 - Georg Schölly
3
应该在某个地方有记录。这是被支持的。(-Ken,Cocoa框架) - Ken
那么你怎么取出它呢?当我尝试使用 CGImageRef img0 = [cgImages objectAtIndex:0]; 时,我会得到“初始化与不兼容的指针类型”错误。 - David Moles
我本来期望这篇文档会提到它被支持,但事实并非如此。换句话说,我会对此保持谨慎。 - silverdr

1

通过image.CGImage从UIImage中获取CGImageRef可能会很昂贵。根据文档:

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

如果您熟悉混合使用C++和Objective-C,可以使用std::vector来存储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;

这比必要的更复杂 - CGImages 可以直接添加到 NSMutableArray 中。 - Ken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接