-2

我对一些在 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;


}

在此处输入图像描述

4

1 回答 1

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
}

(来源:我们如何以编程方式检测设备运行在哪个 iOS 版本上?

于 2013-10-18T16:16:46.927 回答