gpt4 book ai didi

objective-c - 使用 GCD 调度队列 block 外部定义的 C 指针对象 (CGImageRef) 时出现内存问题

转载 作者:行者123 更新时间:2023-12-03 12:49:21 26 4
gpt4 key购买 nike

我正在将图像从磁盘读取到 UIImage 中,并在另一个工作队列 block 中使用其 CGImage 进行媒体处理。

现在,如果我在主队列中定义 CGImageRef 并在工作队列中使用 CGImageRef,我将获得 EXC_BAD_ACCESS。像这样:

UIImage *uiimage = [UIImage imageWithContentsOfFile:[aPhoto completeLargeThumbFilePath]];

CGImageRef cgImage = uiimage.CGImage;

dispatch_queue_t dispatchQueue = dispatch_queue_create("mediaInputQueue", NULL);
[writerInput requestMediaDataWhenReadyOnQueue:dispatchQueue usingBlock:^{

// ... unrelated stuff
CVPixelBufferRef buffer = (CVPixelBufferRef)[self pixelBufferFromCGImage:cgImage size:size];
// ... unrelated stuff
}];

如果我直接在工作队列中使用 uiimage.CGImage,那么我不会收到异常。我认为这与ARC内存管理有关。 UIImage 是一个 Objective-C 对象,CGImageRef 是一个指向 C 结构体的指针。 UIImage 在我可以在第一种情况下使用它的 CGImage 之前就被释放了。

我的问题是如何在另一个调度队列中直接使用主队列中定义的 C 指针?

最佳答案

出现此问题的原因以及 CGImageRetain() 修复该问题的原因是 CGImage 未被 block 保留。这是因为 CGImageRef 不是 Objective-C 对象指针类型。仅当捕获的变量是 Objective-C 对象指针类型时, block 才会自动保留它们。

因此,另一种解决方案是简单地让 block 捕获它的“对象指针类型”版本(所有 Core Foundation 对象都可以视为 Cocoa Objective-C 对象,反之亦然):

UIImage *uiimage = [UIImage imageWithContentsOfFile:[aPhoto completeLargeThumbFilePath]];

CGImageRef cgImage = uiimage.CGImage;

id cgImageAsObject = (__bridge id)cgImage;

dispatch_queue_t dispatchQueue = dispatch_queue_create("mediaInputQueue", NULL);
[writerInput requestMediaDataWhenReadyOnQueue:dispatchQueue usingBlock:^{

// ... unrelated stuff
CGImageRef cgImageAgain = (__bridge CGImageRef)cgImageAsObject;
CVPixelBufferRef buffer = (CVPixelBufferRef)[self pixelBufferFromCGImage:cgImageAgain size:size];
// ... unrelated stuff
}];

关于objective-c - 使用 GCD 调度队列 block 外部定义的 C 指针对象 (CGImageRef) 时出现内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17816644/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com