iOS 7上的图形崩溃

iOS 7上的图形崩溃,ios,ios7,Ios,Ios7,我有一个应用程序,它已经在iOS 6上进行了广泛的测试,运行良好,而在iOS 7上,它几乎总是崩溃(但不是100%的次数),主要是线程1:EXC_BAD_ACCESS错误,没有太多可追踪的地方。我完全不知道它的下落。我相信我的代码中有些东西与核心iOS方法不兼容 我所能确定的最好情况是,在评论代码的以下部分时,一切都运行良好 UIGraphicsBeginImageContext(coverView.bounds.size); [coverView.layer renderInContext:U

我有一个应用程序,它已经在iOS 6上进行了广泛的测试,运行良好,而在iOS 7上,它几乎总是崩溃(但不是100%的次数),主要是线程1:EXC_BAD_ACCESS错误,没有太多可追踪的地方。我完全不知道它的下落。我相信我的代码中有些东西与核心iOS方法不兼容

我所能确定的最好情况是,在评论代码的以下部分时,一切都运行良好

UIGraphicsBeginImageContext(coverView.bounds.size);
[coverView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *coverImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[UIImageJPEGRepresentation(coverImage, 0.8f) writeToFile:coverFilePath atomically:YES];

//Create thumbnail of cover image
CGSize size = CGSizeMake(116.0f, 152.0f);
UIGraphicsBeginImageContext(size);
[coverImage drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)];
coverImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[UIImageJPEGRepresentation(coverImage, 0.8f) writeToFile:coverThumbnailFilePath atomically:YES];
有人能告诉我下一步该去哪里吗?请注意,同一个应用程序在iOS 6中工作得非常出色,并且这个bug非常特定于iOS 7

编辑:附加了僵尸堆栈跟踪:到目前为止,我还不能充分利用它,但对专家来说可能很有用:)

提前感谢,


由于自动布局问题(我的问题),Nikhil在iOS7上几乎没有遇到类似的问题。确保大小存在且有效,例如0,0的大小无法创建有效的图形上下文。
我还添加了一个方法,您可以将其作为UIView上的一个类别使用,以获取特定视图的屏幕截图。如果在iOS6或更低版本上,它使用众所周知的
-renderContext:
,如果在iOS7上,它使用新的
-drawViewHierarchyInRect:
比第一个版本更快,如果发生崩溃,也使用它

- (UIImage *) imageByRenderingViewOpaque:(BOOL) yesOrNO {
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, yesOrNO, 0);

    if ([self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) {
        [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
    }
    else {
        [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    }
    UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return resultingImage;
}

好的,我终于让它工作了。总的来说,这是一次很好的学习经历:)

实际上,“EXE_BAD_ACCESS”的本质确实暗示内存管理不好,即我请求访问一些不存在的东西。不幸的是,(或者说逻辑上,我之前错过了)泄密者找不到它。但当我为僵尸分析我的应用程序时,他们被抓到了

该问题是由于该方法引起的

   [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];   // iOS 7
或在iOS 6中等效

   [self.layer renderInContext:UIGraphicsGetCurrentContext()];
我的应用程序进度的顺序如下所示:

   render view -> update a few things -> request a screenshot be taken on update
   -> update the view -> return to previous view (releasing this one)
现在,因为我要求在更新时拍摄屏幕截图,所以这些方法一直等到视图更新发生。然而,在更新之后,我立即发布了superview。因此,这些方法(在等待更新之后)在发布后称为
this
视图

现在,我不知道这是苹果的iOS错误还是我对它的理解不足。但是现在,我不会在视图更新后立即发布superview,而且一切都正常:)

谢谢你们的帮助。如果我在这里做了一些奇怪的事情,请告诉我,这种行为可以以更有效的方式预防

最好的,
Nikhil

如果UIView的高度接近零(例如0.1),
drawViewHierarchyInRect:AfterScreen更新:
将崩溃。所以在打电话之前先检查一下尺寸


PS:这只发生在iOS 7上

您是否打开了异常断点?我想并不是因为你说的是一场主要的车祸。打开它们(这里和谷歌上都有很多指南),然后你会找到更具体的一行。转到
断点导航器
,点击加号和
添加异常断点
,然后选择
抛出异常
。然后构建并运行并粘贴到这里更具体的日志。然后我们就可以帮助你了。我已经打开了它们,但它们什么也没听到:(。崩溃似乎在记忆中。我怀疑我指的是我(读过的ARC)在某个地方之前发布。请向我们显示
文件路径
也。当断点设置为
在抛出时
你应该在应用程序崩溃时选择行。你做错了什么。请在应用程序崩溃时粘贴日志。这个断点很好地捕获了
EXC_BAD_访问
崩溃。@tomaszzulc,我有
所有异常
已打开。仍然不走运。我将很快发布coverThumbnailFilePath,但令人惊讶的是,即使在除前两行之外的所有内容都被注释时,崩溃也会发生,即
UIGraphicsBeginImageContext(coverView.bounds.size);[coverView.layer RenderContext:UIGraphicsGetCurrentContext()];
…我认为UIGraphics或我对它的使用有问题。谢谢Andrea。这并不能解决我的问题,应用程序仍然崩溃:(在发送消息之前你检查过UIView的状态吗?是的……我检查过。它的大小和尺寸都很好