0

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

- (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);
}

有任何想法吗?

4

2 回答 2

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);
}
于 2013-03-25T23:31:54.647 回答
1

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

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

只需添加到循环的底部:

[image release];
[bitmapRep release];
CGImageRelease(image1);
于 2013-03-25T23:39:21.760 回答