Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios renderInContext创建内存泄漏_Ios_Memory Management_Memory Leaks_Core Graphics_Screenshot - Fatal编程技术网

Ios renderInContext创建内存泄漏

Ios renderInContext创建内存泄漏,ios,memory-management,memory-leaks,core-graphics,screenshot,Ios,Memory Management,Memory Leaks,Core Graphics,Screenshot,我正在两个视图控制器之间创建自定义转换。为了做到这一点,我抓取了视图顶部和底部自定义区域的屏幕截图,以便为它们设置动画 然而,每当我这样做的时候,一个ImageIO_JPEG_数据就会为每个从未消除或发布的转换创建7-8MB。您可以在下面的instruments屏幕截图中看到三个 拖拉stackoverflow回答了关于的类似问题,我已经尝试在带有dispatch_asynchdispatch_get_main_queue^{的主线程上运行它,并添加了一个@autorelease池,但没有效果

我正在两个视图控制器之间创建自定义转换。为了做到这一点,我抓取了视图顶部和底部自定义区域的屏幕截图,以便为它们设置动画

然而,每当我这样做的时候,一个ImageIO_JPEG_数据就会为每个从未消除或发布的转换创建7-8MB。您可以在下面的instruments屏幕截图中看到三个

拖拉stackoverflow回答了关于的类似问题,我已经尝试在带有dispatch_asynchdispatch_get_main_queue^{的主线程上运行它,并添加了一个@autorelease池,但没有效果

我是否遗漏了一些东西,或者是否有更好的方法来创建这些不会造成内存泄漏的屏幕截图

//Get Top View
CGSize photoSize = CGSizeMake(self.view.frame.size.width, topHeight);

UIGraphicsBeginImageContextWithOptions(photoSize, NO, 0.0f);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * snapshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.view.layer.contents = nil;

topTransitionView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, snapshot.size.width, snapshot.size.height)];
topTransitionView.image = snapshot;

//Get Bottom View
CGRect photoRect = CGRectMake(0, imageFrame.origin.y + imageFrame.size.height, self.view.frame.size.width,self.view.frame.size.height - (imageFrame.origin.y + imageFrame.size.height));

if (photoRect.size.height <= 0) {
    photoRect.size.height =1;
}

UIGraphicsBeginImageContextWithOptions(photoRect.size, NO, 0.0f);
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(ctx, -photoRect.origin.x, -photoRect.origin.y);
[self.view.layer renderInContext:ctx];
UIImage *bottomSnapshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.view.layer.contents = nil;

bottomTransitionView = [[UIImageView alloc]initWithFrame:CGRectMake(0, imageFrame.origin.y + imageFrame.size.height, bottomSnapshot.size.width, bottomSnapshot.size.height)];
bottomTransitionView.image = bottomSnapshot;

您正在向我们展示topTransitionView和bottomTransitionView的实例化,但您没有向我们展示它们添加的位置,或者更重要的是,前面的视图被删除的位置。在实例化这些视图的新集合之前,您是否在某处执行removeFromSuperview?您是否通过产品菜单上的静态分析器分析运行了此操作?Y是的,我在所有topTransitionView和bottomTransitionView上调用removeFromSuperView,并在转换完成后将它们设置为nil。您可以尝试drawViewHierarchyInRect iOS 7+,但我怀疑问题出在RenderContext。顺便说一句,通过分配工具,它可以显示泄漏对象的分配位置。我还可以eck po[[UIWindow keyWindow]递归描述]在lldb提示符下,或者使用新的Xcode 6 view debugger来确保没有东西挥之不去。是的。或者一些被放弃的东西,例如,我没有使用self.view.layer.contents=nil构造,而是显式删除UIKit或CALayer的东西,尽管我怀疑这是问题所在。在分配工具、静态分析器和视图调试工具之间,我希望您能够确定问题的类别,使进一步的诊断更容易。抱歉,这类事情很难远程完成。但感觉好像某个地方没有发布图像,我个人认为这不是快照。谢谢您的建议,尽管11db提示符的最后一部分我不确定你指的是什么。