[英]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.