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