2

ウェブカメラの動画を視聴できるアプリを開発中です。ここで、バックグラウンドスレッドを使用して新しい録画ビデオ機能を追加したいと思います。

.hファイル内

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

.mファイル内。ユーザーが記録ボタンを押すと、ImageDataのDocumentsDirへの保存が開始されます

@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

cgImageがタイプの場合CGImageRef、それはC構造体へのポインターであることを意味し、Objective-Cオブジェクトにキャストしてみてください。

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