2013-03-25 55 views
0

我有一个内存问题与小应用程序无限量的截图每X毫秒,并在ImageView中显示它们。即使使用自动释放,它也会非常迅速地淹没内存。下面的代码:目标C @autoreleasepool无限循环采取截图

- (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

你不能没有ARC使用@autoreleasepool。 – 2013-03-25 23:29:30

+5

@RamyAlZuhouri:是的,你可以。它与ARC同时推出,但不需要ARC。 – 2013-03-25 23:39:13

+2

由于你从来没有将控制权返回给runloop,我假设这是在后台线程上运行。您正在访问仅在主线程中允许的UI控件('_imageView')。你应该改变它为'dispatch_async(dispatch_get_main_thread(),^ {_imageView.image = image;});' – 2013-03-25 23:40:34

回答

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); 
} 
+0

谢谢你做到了。我认为ARC正在照顾释放该图像。 – m1n0 2013-03-26 08:02:44

+1

ARC正在照顾释放ObjC对象,如'NSImage'和'NSBitmapImageRep'。但'CGImageRef'是ARC无法为您处理的核心基础对象(只是指向C结构的指针) – 2013-03-26 09:56:09

+0

感谢您的解释。 – m1n0 2013-03-26 12:29:47

1

我假设你不使用ARC这里来释放图像。

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

只需添加到您的循环的底部:

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