-2

iOS5 では例外をスローするが、6 および 7 では機能する一部の画像スケーリング コードに問題があります。

5 を実行しているユーザーをサポートする必要があるため、例外が発生したときに特別な iOS5 コードを呼び出す try-catch をコーディングしようとしています。

例外 (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 に答える