2014-09-30 31 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; 
}