Try-Catch在缩放UIImage时处理Apple异常

Jou*_*man -2 exception objective-c try-catch uiimage ios

我有一些图像缩放代码的问题,在iOS5中引发异常但在6和7中工作.

我需要支持运行5的用户,所以我试图编写一个try-catch,它会在异常发生时调用一些特殊的iOS5代码.

异常(EXC_BAD_ACCESS)似乎发生在Apple代码中,我的代码中的异常处理程序不处理错误,但应用程序只是立即崩溃.

那么,任何人都可以建议一种更强大的方法来尝试捕捉异常,或者任何人都可以对更好的缩放图像方式有所了解吗?(记住这是针对iOS5的)

我的主要图像缩放功能(包含不起作用的异常捕获器):

+ (UIImage *)imageWithImage:(UIImage *)image scaledToMax:(int)maxDimension {

    // Get a copy of the image where the new image has a maximum height or width as specified by maxDimension

    float scaleFactor;

    if (image.size.width<=maxDimension && image.size.height<=maxDimension)
    {
        return image;
    }

    if (image.size.width>image.size.height)
    {
        scaleFactor = maxDimension / image.size.width;

    } else {

        scaleFactor = maxDimension / image.size.height;

    }

    float newWidth = roundf(image.size.width * scaleFactor);
    float newHeight = roundf(image.size.height * scaleFactor);

    CGSize newSize = CGSizeMake(newWidth, newHeight);

    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);

    NSLog(@"HPSImageHelper imageWithImage point a %f %f", newSize.width, newSize.height);

    UIImage *newImage;

    @try {

        [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];

        NSLog(@"HPSImageHelper imageWithImage point b");
        newImage = UIGraphicsGetImageFromCurrentImageContext();
        NSLog(@"HPSImageHelper imageWithImage point c");
        UIGraphicsEndImageContext();

    }
    @catch (NSException * e) {

        NSLog(@"HPSImageHelper imageWithImage point d");

        newImage = [image scaleToSize:newSize];

        NSLog(@"HPSImageHelper imageWithImage point e");
    }

    NSLog(@"HPSImageHelper imageWithImage point f");

    return newImage;


}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Gab*_*lla 5

除非错误无法恢复,否则不要捕获异常

这不是Java,请阅读iPhone/Objective-C的Try-catch异常处理实践

并且无论如何都不要捕获NSException(PokemonExceptionHandling).如果你真的必须捕获异常,你想捕获一个特定的异常.


回到你的具体问题,EXC_BAD_ACCESS意味着你以错误的方式访问内存,程序崩溃了.没有例外.

您必须查找您尝试访问的悬空指针或未初始化的变量.

如果您只想对不同的系统版本执行不同的操作,只需检查版本并拆分控制流,例如:

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_5_1) {
   // Do specific operations for iOS 5.1 or earlier
} else {
   // Do specific operations for iOS 6 or later
}
Run Code Online (Sandbox Code Playgroud)

(来源:我们如何以编程方式检测运行设备的iOS版本?)