簡體   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