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