2013-03-25 42 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);