【问题标题】:Declaring struct as pointer so it can be checked whether it is initialized将 struct 声明为指针,以便检查它是否已初始化
【发布时间】:2012-06-08 18:57:48
【问题描述】:

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

【问题讨论】:

  • 没有点赞?没有接受的答案?

标签: objective-c c pointers struct null


【解决方案1】:

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

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

编辑澄清:当然,我的意思是上述作为使用指针的替代方法。所以,我建议只是将viewTransform 恢复为CGAffineTransform,而不是指针,然后如果您没有将其设置为任何内容,请尽早返回。

【讨论】:

    【解决方案2】:

    这将像地狱一样崩溃。您将 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()变换指针。

    【讨论】:

      【解决方案3】:
          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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-20
        • 1970-01-01
        • 2018-11-05
        • 2017-09-06
        • 1970-01-01
        • 2017-06-22
        • 2013-01-21
        相关资源
        最近更新 更多