2

我正在开发一个可以观看网络摄像头视频的应用程序。现在我想通过使用后台线程添加一个新的录制视频功能。

在 .h 文件中

@property (nonatomic, retain) UIImage *image;
@property (nonatomic, retain) NSData *imageData;

在 .m 文件中。当用户按下记录按钮时,它开始将 ImageData 保存到 Documents Dir

@synthesize image;
@synthesize imageData
...

- (void) playVideo:(NSData *)data { 
        ...
     // play video code
     CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
     CGDataProviderRef provider = CGDataProviderCreateWithCFData(data);
     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
     CGImageRef cgImage = CGImageCreate(width, hieght, 8, 24,
                            bpp * width, colorSpace, bitmapInfo,
                            provider, NULL, NO, kCGRenderingIntentDefault); 
    CGColorSpaceRelease(colorSpace);
    [videoImage = [setImage: UIImage imageWithCGImage:cgImage]];

    CGImageRelease(cgImage);
    CGDataProviderRelease(provider);
    // play video code end
    ...
    if(record == TRUE) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
            (unsigned long)NULL), ^(void) {
            image = [UIImage imageWithCGimage:cgImage];
            imageData = [UIImageJPEGRepresentation(image, 1)];
            [imageData writeToFile:DirPath atomically:NO];
        });
    }
}

到目前为止,播放视频代码似乎工作正常。然后我在它下面添加线程并收到错误消息

[Not a type retain]: message sent to deallocated instance 
[Not a type class]: message sent to deallocated instance
在线程中
image = [UIImage imageWithCGimage:cgImage];
你能告诉我为什么会这样吗?或有其他方法可以做到这一点。谢谢。

4

2 回答 2

1

您在调度之前释放 cgImage。->CGImageRelease(cgImage);
将此行移动到块的末尾(内部)。

于 2012-10-24T07:14:16.163 回答
0

如果cgImageCGImageRef类型,那么这意味着它是一个指向 C-struct 的指针,尝试将其强制转换为 Objective-C 对象:

        //set play video code like this
        [videoImage setImage: [UIImage imageWithCGImage:(id)cgImage]];
于 2012-10-23T03:54:50.090 回答