2014-09-30 73 views
0

我有一個函數,它將接口的屏幕截圖保存到一個實例屬性(稱爲self.interfaceScreenshot)。drawViewHierarchyInRect導致虛擬機CG圖像內存泄漏

-(void)takeInterfaceScreenshot{ 
    // Iterate over every window from back to front 

    for (UIWindow *window in [[UIApplication sharedApplication] windows]) 
    { 
     if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen]) 
     { 
      UIGraphicsBeginImageContext([window bounds].size); 
      [[self view] drawViewHierarchyInRect:[window bounds] afterScreenUpdates:YES]; 
     } 
    } 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    if(self.interfaceScreenshot != nil){ 
     self.interfaceScreenshot = nil; 
    } 

    self.interfaceScreenshot = image; 
} 

但我在儀器探查我每次調用這個函數時,有可能在VM泄漏額外的持久化實例看到:分配統計數據的CG圖片部分:

enter image description here

我正在使用iOS7。

回答

0

經過一些試驗後,我發現錯誤是在循環內有UIGraphicsBeginImageContext([window bounds].size);。這工作得很好:

-(void)takeInterfaceScreenshot{ 

    UIGraphicsBeginImageContext([window bounds].size); 

    // Iterate over every window from back to front 
    for (UIWindow *window in [[UIApplication sharedApplication] windows]) 
    { 
     if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen]) 
     { 
     [[self view] drawViewHierarchyInRect:[window bounds] afterScreenUpdates:YES]; 
     } 
    } 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    if(self.interfaceScreenshot != nil){ 
     self.interfaceScreenshot = nil; 
    } 

    self.interfaceScreenshot = image; 
}