4

CGImageRefsの可変コレクションを保持したいと思います。それらをNSValueでラップする必要がありますか?もしそうなら、どのようにそれらを適切にラップおよびアンラップしますか?C配列の使用をやめることはできますか?もしそうなら、どのようにそれを構築し、どのように後で要素を追加するのですか?コレクションの要素としてCGImageRefsの代わりにUIImagesを使用する方がはるかにコストがかかりますか?

4

3 に答える 3

13

CGImageをNSMutableArrayに直接追加できます。コンパイラの警告を回避するには、(id)にキャストする必要があります。

CFTypeはNSObjectにブリッジされます。NSObjectが応答する任意のメッセージを任意のCFTypeに送信できます。特に、-retainと-releaseは通常どおり機能します。

于 2009-09-08T07:16:17.673 に答える
12

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

これが誰かに役立つことを願っています

于 2011-12-03T16:49:50.667 に答える
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;
于 2009-09-08T06:46:24.727 に答える