2009-09-08 80 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 ]; 

希望這有助於有人