0

在下面的代码中,我想知道viewTransform结构是否被初始化,以确定是否旋转我的视图。所以我做viewTransform了一个指针,而不仅仅是一个常规变量。

这是良好的编程实践,还是有一些潜在的警告?

如果必须,我可以改为声明 aBOOL来跟踪是否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-... 链的末尾,以避免整个需要检查转换是否已设置。

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

于 2012-06-09T11:50:55.223 回答
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;
}
于 2014-08-18T13:13:06.487 回答