2012-12-19 53 views
1

我該如何解決這個內存泄漏問題?我有一個NSBezierPath的集合嗎?我該如何解決這個內存泄漏問題?有什麼建議?我正在使用ARC。Objective-C NSImage,內存泄漏(任何建議)我正在使用ARC

int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 

     // insert code here... 
     for(int j=0;j<5000;j++){ 
      NSLog(@"Hello, World!"); 
      NSSize imageSize = NSMakeSize(512, 512); 
      NSImage *image = [[NSImage alloc] initWithSize:imageSize]; 
      //draw a line: 
      for(int i=0;i<1000;i++){ 
       [image lockFocus]; 
       float r1 = (float)(arc4random() % 500); 
       float r2 = (float)(arc4random() % 500); 
       float r3 = (float)(arc4random() % 500); 
       float r4 = (float)(arc4random() % 500); 
       [NSBezierPath strokeLineFromPoint:NSMakePoint(r1, r2) toPoint:NSMakePoint(r3, r4)]; 
      } 
      //... 

      NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0, 0, imageSize.width, imageSize.height)]; 
      NSData *pngData = [imageRep representationUsingType:NSPNGFileType properties:nil]; 
      [image unlockFocus]; 

      NSString *jstring = [NSString stringWithFormat:@"%d", j]; 
      jstring = [jstring stringByAppendingString:@".png"]; 
      [pngData writeToFile:jstring atomically:YES]; 
     } 
    } 

    return 0; 
} 
+0

你說得對,我很新。我喜歡製作5000張帶有隨機線條的照片。 – user1735714

回答

4

修訂的答案,現在我知道你正在使用ARC:

這可能不是你漏,但你的自動釋放池越來越大與循環的每次迭代,因爲自動釋放池在你的循環完成之前不會清空。

你需要做的是在你的循環中使用第二個autorelease池。下面是你的代碼的修改版本來說明這一點。

int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool { 
     // insert code here... 
     for(int j=0; j<5000; j++) { 
      NSLog(@"Hello, World!"); 
      NSSize imageSize = NSMakeSize(512, 512); 
      @autoreleasepool { 
       NSImage *image = [[NSImage alloc] initWithSize:imageSize]; 
       //draw a line: 
       NSData *pngData; 
       for(int i=0;i<1000;i++){ 
        [image lockFocus]; 
        float r1 = (float)(arc4random() % 500); 
        float r2 = (float)(arc4random() % 500); 
        float r3 = (float)(arc4random() % 500); 
        float r4 = (float)(arc4random() % 500); 
        [NSBezierPath strokeLineFromPoint:NSMakePoint(r1, r2) toPoint:NSMakePoint(r3, r4)]; 
        //... 

        NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0, 0, imageSize.width, imageSize.height)]; 
        pngData = [imageRep representationUsingType:NSPNGFileType properties:nil]; 
        [image unlockFocus]; 
       } 

       NSString *jstring = [NSString stringWithFormat:@"%d", j]; 
       jstring = [jstring stringByAppendingString:@".png"]; 
       [pngData writeToFile:jstring atomically:YES]; 
      } 
     } 
    } 

    return 0; 
} 

雖然你似乎還有其他問題。你正在爲你的文件構建一個完整的路徑嗎?

+0

什麼錯誤?請詳細說明。 – trudyscousin

+0

嗨,我收到錯誤ARC禁止顯式的消息發送或發佈 – user1735714

+0

@ user1735714請參閱我的編輯。 'pngData'需要在你的循環範圍之外聲明。 – trudyscousin