0

viewTransform以下のコードでは、ビューを回転するかどうかを判断するために、構造体が初期化されているかどうかを知りたいと考えています。そこでviewTransform、通常の変数ではなくポインターを作成しました。

これは適切なプログラミング手法ですか? または潜在的な注意点はありますか?

必要に応じて、代わりに を宣言して、が初期化されているBOOLかどうかを追跡することもできviewTransformます。

- (void)deviceOrientationDidChange
{
    UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];

    CGAffineTransform *viewTransform = NULL;

    if (deviceOrientation == UIDeviceOrientationPortrait)
    {
        *viewTransform = CGAffineTransformIdentity;
    }
    else if (deviceOrientation == UIDeviceOrientationPortraitUpsideDown)
    {
        *viewTransform = CGAffineTransformMakeRotation(M_PI * 1.0f);
    }
    else if (deviceOrientation == UIDeviceOrientationLandscapeLeft)
    {
        *viewTransform = CGAffineTransformMakeRotation(M_PI * -0.5f);
    }
    else if (deviceOrientation == UIDeviceOrientationLandscapeRight)
    {
        *viewTransform = CGAffineTransformMakeRotation(M_PI * 0.5f);
    }

    if (viewTransform != NULL)
    {
        for (UIView *view in self.autoRotateViews)
        {
            [view setTransform:(*viewTransform)];
        }
    }
}
4

3 に答える 3

1

これは地獄のようにクラッシュします。viewTransformをNULLとして宣言してから、間接参照します。代わりに、それをポインタにしないでください。使用する

CGAffineTransform viewTransform;

代わりに、はい、BOOLを使用して初期化状態を追跡します。

物事を過度に複雑にすることを犠牲にしてBOOLの使用を本当に避けたい場合は、次のこともできます。

CGAffineTransform *viewTransform = NULL;
if (deviceOrientation == UIDeviceOrientationPortrait)
{
    viewTransform = malloc(sizeof(*viewTransform));
    NSAssert(viewTransform != NULL, @"malloc() failed");
    *viewTransform = CGAffineTransformIdentity;
}

次に、viewTransformがNULL(初期化されていない)またはNULL以外(初期化されている)であることを確認します。

free()この(非常に複雑な)アプローチを選択する場合は、使用後に変換ポインターを忘れないでください。

于 2012-06-08T19:02:16.890 に答える
1

あなたが書いたものがクラッシュするというH2CO3は正しいです。

else return;if-else-if-... チェーンの最後に追加するだけで、変換が設定されているかどうかを確認する必要がなくなります。

明確にするために編集:もちろん、ポインターを使用する代わりに上記を意味します。したがって、ポインターではなく に戻し、何も設定していない場合は早期に戻ることをお勧めしますviewTransformCGAffineTransform

于 2012-06-09T11:50:55.223 に答える