仅由于内存错误,iOS8 上的应用程序崩溃

Posted

技术标签:

【中文标题】仅由于内存错误,iOS8 上的应用程序崩溃【英文标题】:Application crashes on iOS8 only due to Memory Error 【发布时间】:2014-11-20 06:30:01 【问题描述】:

我正在尝试生成图表并一张一张地截取它的屏幕截图。该应用程序一次正常工作,然后当我第二次尝试再次捕获屏幕截图时,应用程序崩溃说应用程序因内存错误而终止。这仅发生在 ios8 中,而不发生在 iOS7 中。这是捕获屏幕截图的代码,它在线崩溃 - [view.layer renderInContext:context]; 该应用程序在峰值使用时使用 124 MB,并且在崩溃之前没有生成内存警告。即使没有其他应用程序在后台运行,应用程序也会在 iOS 8 上崩溃。如果我注释掉上面的行,应用程序根本不会崩溃,但截取的屏幕截图不是完整的屏幕。

- (BOOL)captureView:(UIView *)view forGraph:(NSString *)graphName


BOOL isImageCpatured = NO;

@try 
    CGRect rect = view.bounds;
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    [view.layer renderInContext:context];
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    CGImageRef imageRef;

    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) 
        imageRef = CGImageCreateWithImageInRect([img CGImage], CGRectMake(0, 113, 1024, 532));
    
    else 
        imageRef = CGImageCreateWithImageInRect([img CGImage], CGRectMake(0, 93, 1024, 532));
    

    img = nil;

    UIImage *image = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);        
    NSData *pngData = UIImagePNGRepresentation(image);

    [pngData writeToFile:[Utility_Class documentsPathForFileName:[NSString stringWithFormat:@"%@BG.png",graphName]] atomically:YES];

    pngData = nil;

    image = nil;

    isImageCpatured = YES;


@catch (NSException *exception) 
    return isImageCpatured;

@finally 



return isImageCpatured;

可能出了什么问题?我找不到任何解决方案。我发现内存压力与内存错误不同。但没有解决方案如何解决它。甚至在 @autorelease 池中调用 captureView 函数。

这是在 iOS8 上生成的未知崩溃日志。 iOS7它永远不会崩溃。

Incident Identifier: 24F29058-7D47-40B6-87B4-2183220DB55B
CrashReporter Key:   6079e634bf7aeebb0e4d9ea95336cb33b0fc49dd
Hardware Model:      iPad4,1
OS Version:          iPhone OS 8.0 (12A365)
Kernel Version:      Darwin Kernel Version 14.0.0: Tue Aug 19 15:09:47 PDT 2014; root:xnu-2783.1.72~8/RELEASE_ARM64_S5L8960X
Date:                2014-09-25 18:21:25 +0530
Time since snapshot: 88 ms
Free pages:                              2219
Active pages:                            96945
Inactive pages:                          48102
Speculative pages:                       314
Throttled pages:                         0
Purgeable pages:                         2
Wired pages:                             77304
File-backed pages:                       40758
Anonymous pages:                         104603
Compressions:                            1467794
Decompressions:                          158957
Compressor Size:                         24980
Uncompressed Pages in Compressor:        119797
Page Size:                               16384
Largest process: my application Name

【问题讨论】:

> 能否提供崩溃日志?? 我还有一个应用程序在 iOS 8 中崩溃,看似随机,但在 iOS 7 中没有。奇怪... 我的应用也有同样的问题。它发生在 iPhone 5s 和 6 上,但不是 5!崩溃日志说这是内存问题。 @mm2001 你用 ARC 吗? @Mota,是的,我使用 ARC。虽然我添加了 Crashlytics 并且现在得到了一个可重复的堆栈跟踪,但出现了这个错误:***.com/questions/19560198/…. 您是否尝试过在 Instruments Allocations 中分析您的应用程序?最好同时在 iOS 7 和 iOS 8 上,然后比较结果?可能是 iOS 8 中的错误。 【参考方案1】:

这是由于 CGImageCreateWithImageInRect 的错误造成的。看到这个:http://openradar.appspot.com/radar?id=5780787475513344

来源:https://twitter.com/steipete/status/524224268952158208

【讨论】:

您能在此处发布有关 SO 的相关信息吗?引用、方法等

以上是关于仅由于内存错误,iOS8 上的应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的更新后的应用程序在仅适用于 IOS8 的启动时崩溃?

由于堆大小增加,android中的内存不足错误

应用程序仅在 iPhone 8 iOS 14.4.1 上因内存不足而崩溃

C程序为啥会崩溃?

为啥我的弹出框在 iPhone 6 Plus 上的 iOS 8.1 中崩溃? iOS 8 工作(实际上是 Xcode 6.0 到 6.1 的错误)

server2008物理内存使用82%导致程序内存错误