将struct声明为指针,以便检查它是否已初始化

时间:2012-06-08 18:57:49

标签: objective-c c pointers struct null

在下面的代码中,我想知道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)];
        }
    }
}

3 个答案:

答案 0 :(得分: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()变换指针。

答案 1 :(得分:1)

H2CO3是正确的,你写的东西会崩溃。

您可以将else return;添加到if-else-if -...链的末尾,以避免检查是否已设置转换。

编辑澄清:当然,我的意思是上面作为使用指针的替代方法。所以,我建议只将viewTransform恢复为CGAffineTransform,而不是指针,然后如果你没有将它设置为任何东西则提前返回。

答案 2 :(得分:0)

    switch (orientation) {
    case UIDeviceOrientationLandscapeLeft:
        t = CGAffineTransformMakeRotation(M_PI_2);
        break;
    case UIDeviceOrientationLandscapeRight:
        t = CGAffineTransformMakeRotation(-M_PI_2);
        break;
    case UIDeviceOrientationPortraitUpsideDown:
        t = CGAffineTransformMakeRotation(M_PI);
        break;
    case UIDeviceOrientationPortrait:
        t = CGAffineTransformIdentity;
        break;
    default:
        return;
}