【问题标题】:drawViewHierarchyInRect causing VM CG Image memory leakdrawViewHierarchyInRect 导致 VM CG Image 内存泄漏
【发布时间】:2014-09-30 14:26:32
【问题描述】:

我有一个函数可以截取界面的屏幕截图并将其保存到实例属性(称为 self.interfaceScreenshot)。

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

但我在 Instruments 分析器中看到,每次我调用此函数时,都会在 VM 中泄漏一个额外的持久实例:分配统计信息的 CG Image 部分:

我正在使用 iOS7。

【问题讨论】:

    标签: objective-c ipad memory-leaks


    【解决方案1】:

    经过一些尝试,我发现错误是在循环中包含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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-06
      • 2014-06-07
      • 2013-11-20
      • 2011-10-28
      • 2016-01-18
      • 2012-12-13
      • 1970-01-01
      • 2011-01-08
      相关资源
      最近更新 更多