Objective C @autoreleasepool无限循环截取屏幕截图

时间:2013-03-25 23:27:26

标签: objective-c xcode memory-leaks screenshot autorelease

我有一个内存问题,小应用程序每X毫秒拍摄无限量的屏幕截图并在imageview中显示它们。即使使用自动释放,它也会很快淹没内存。这是代码:

- (void)draw {
    do {
        @autoreleasepool {
            CGImageRef image1 = CGDisplayCreateImage(kCGDirectMainDisplay);

            NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:image1];
            NSImage *image = [[NSImage alloc] init];
            [image addRepresentation:bitmapRep];
            _imageView.image = image;
            [NSThread sleepForTimeInterval:1];
        }
    }while(true);
}

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

您需要使用CGImageRelease

发布图片
- (void)draw {
    do {
        @autoreleasepool {
            CGImageRef image1 = CGDisplayCreateImage(kCGDirectMainDisplay);

            NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:image1];
            NSImage *image = [[NSImage alloc] init];
            [image addRepresentation:bitmapRep];
            _imageView.image = image;
            CGImageRelease(image1);   // release the image
            [NSThread sleepForTimeInterval:1];
        }
    }
    while(true);
}

答案 1 :(得分:1)

我假设您在这里没有使用ARC。

您似乎误解了自动释放池的功能。它不会通过自己的特权神奇地释放物体(这就是ARC的用途!)。您可以将对象添加到池中 - 使用autorelease(在托管保留/释放模式下)或使用为您自动释放的便捷构造函数 - 当它被销毁时,池将每次释放每个对象一次objet被添加到池中。您在此处创建对象的方法alloc会返回您拥有的对象,因此您必须明确释放对象的所有权。

只需添加到循环的底部:

[image release];
[bitmapRep release];
CGImageRelease(image1);