繁体   English   中英

iOS中的开放式内存管理(带有ARC的Objective-c)

[英]Open-CV memory management in iOS (Objective-c with ARC)

这可能是一个愚蠢的问题,但在iOS中进行编程时ARC(自动引用计数)是否与Open CV交互?

我问这个是因为我最近刚开始使用Open CV。 在使用ARC的iOS上,没有必要担心对象,因为我只需要确保没有指针指向它们以便它们可以被释放。

Open CV似乎有类似的清理功能:

http://opencv.willowgarage.com/documentation/cpp/memory_management.html

使用新接口时,大多数内存释放甚至内存分配操作都会在需要时自动完成。

首先,这是否意味着我不必释放这些对象?

其次,我在同一个.mm文件中使用OpenCV和Objective C. 假设对象不会互相搞乱是否安全?

例如,这将从cv Mat给我一个UIImage:

+ (UIImage *)imageWithCVMat:(const cv::Mat&)cvMat
{
    return [[UIImage alloc] initWithCVMat:cvMat];
}

哪个使用这个:

- (id)initWithCVMat:(const cv::Mat&)cvMat
{
    NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize() * cvMat.total()];

    CGColorSpaceRef colorSpace;

    if (cvMat.elemSize() == 1)
    {
        colorSpace = CGColorSpaceCreateDeviceGray();
    }
    else
    {
        colorSpace = CGColorSpaceCreateDeviceRGB();
    }

    CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);

    CGImageRef imageRef = CGImageCreate(cvMat.cols,                                     // Width
                                        cvMat.rows,                                     // Height
                                        8,                                              // Bits per component
                                        8 * cvMat.elemSize(),                           // Bits per pixel
                                        cvMat.step[0],                                  // Bytes per row
                                        colorSpace,                                     // Colorspace
                                        kCGImageAlphaNone | kCGBitmapByteOrderDefault,  // Bitmap info flags
                                        provider,                                       // CGDataProviderRef
                                        NULL,                                           // Decode
                                        false,                                          // Should interpolate
                                        kCGRenderingIntentDefault);                     // Intent   

    self = [self initWithCGImage:imageRef];
    CGImageRelease(imageRef);
    CGDataProviderRelease(provider);
    CGColorSpaceRelease(colorSpace);

    return self;
}

*取自Robin Summerhill的方法

提前感谢任何建议。

首先,这是否意味着我不必释放这些对象?

是的,直到您使用new运算符创建它们。 看看这段代码:

{
cv::Mat image(640,480); // allocate image
//.. do something with it
self.myImage = [UIImage imageWithCVMat:image];
}
// Out of scope - image is deallocated automatically.
// But self.myImage is still accessible since it contains a copy of image.

其次,我在同一个.mm文件中使用OpenCV和Objective C. 假设对象不会互相搞乱是否安全?

initWithCVMat functiton中,图像数据被复制到NSData对象,该对象用于初始化UIImage的新实例。

对你而言,这意味着:
1)UIImage类的实例将负责释放图像数据。 如果您使用ARC - 它将自动完成; 否则你必须调用[UIImage发布]
2)不要担心cv :: Mat - 它会在销毁时自动释放内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM