2013-12-09 52 views
0

我已经定义了一个变量,它给了我如下的输出。比较#define给出不正确的结果

iPhone 4 >> 4 
iPhone 5 >> 5 
iPad >> 999 

使用的功能如下。

#define iPhone4Or5 [[UIScreen mainScreen] bounds].size.height == 568 ? 5 : 
     ([[UIScreen mainScreen] bounds].size.height == 480 ? 4 : 999) 

当我的NSLog变量iPhone4Or5,它给了我正确的结果为iPhone 5,但是当我做比较,它给了我错误的结果...

if (iPhone4Or5==999) { 
    NSLog("Its iPad version"); 
} else { 
    NSLog("Its iPhone version"); 
} 

当我与iPhone 5上面运行,或以上,它总是给我NSLog作为它的iPad版本

任何想法为什么我得到错误的比较结果?

我在prefix.pch

注定义变量:

如果我执行NSLog("iPhone4Or5==%d", iPhone4Or5),我得到的输出iPhone4Or5==5

+0

当设备/模拟器处于横向模式时,您会做什么?高度不是别的吗?即纵向模式的宽度。 – matsr

+1

不要在这里使用宏。你使用它们的方式是反模式。 ;) – CouchDeveloper

+0

如果你坚持使用宏,请确保使用足够的括号来避免操作符优先级问题和其他陷阱。 –

回答

0

您有运算符优先级的问题 - 你的宏需要括号:

#define iPhone4Or5 ([[UIScreen mainScreen] bounds].size.height == 568 ? 5 : \ 
     ([[UIScreen mainScreen] bounds].size.height == 480 ? 4 : 999)) 

Better仍然,避免这种情况以及其他常见的宏相关的问题,并使用一个函数:

int iPhone4Or5(void) 
{ 
    const int height = [[UIScreen mainScreen] bounds].size.height; 
    if (height == 568) return 5; 
    if (height == 480) return 4; 
    return 999; 
} 
+0

如果我NSLog,iPhone4Or5我得到的结果是5 ... –

+0

你读过我的答案中的第一句话吗? –

+0

只是好奇,什么括号造成问题?我担心的是,当我将价值看作5时,为什么比较会给出错误的结果? –

0

日志[UIScreen mainScreen] bounds].size.height值并检查它是否480.

或者您可以使用这些。

#define IS_IPAD ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] && [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 

#define IS_IPHONE5 (((!IS_IPAD && [[UIScreen mainScreen] bounds].size.height == 568))?YES:NO)