我有一个内存问题,小应用程序每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);
}
有什么想法吗?
答案 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);