【问题标题】:How do I create a mutable array of CGImageRefs?如何创建一个可变的 CGImageRefs 数组?
【发布时间】:2010-11-26 09:54:05
【问题描述】:

我想保留一个可变的 CGImageRef 集合。我是否需要将它们包装在 NSValue 中,如果需要,如何正确包装和打开它们?我可以摆脱使用 C 数组吗?如果是这样,我该如何构造它以及以后如何向其中添加元素?使用 UIImages 而不是 CGImageRefs 作为集合的元素是否成本更高?

【问题讨论】:

    标签: iphone objective-c arrays uikit cgimage


    【解决方案1】:

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

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

    【讨论】:

    • 我没有找到任何可以将 CFType 转换为 NSObject 的文档,这样做时要小心。更新可能会在将来破坏您的代码。
    • 它应该记录在某个地方。这是支持的。 (-Ken,可可框架)
    • 那你怎么弄出来的?当我尝试CGImageRef img0 = [cgImages objectAtIndex:0]; 时,我得到“从不兼容的指针类型初始化”。
    • 我希望this piece of documentation 能说明它受到支持,但事实并非如此。 IOW 我会小心的。
    【解决方案2】:

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

    希望这对某人有帮助

    【讨论】:

      【解决方案3】:

      通过 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。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多