我在iOS设备上检测视网膜显示时遇到问题。我正在使用以下代码,这些代码是由不同的人推荐的:
BOOL isRetina()
{
UIScreen* s = [UIScreen mainScreen];
if ([s respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
[s respondsToSelector:@selector(scale)])
{
CGFloat scale = [s scale];
return scale == 2.0;
}
return NO;
}
问题是它可以很好地编译部署目标iOS 4及更高版本,但是当我为iOS3.2编译时,我在“scale = [s scale]”行中得到“初始化中的不兼容类型”错误,因为我'我试图将一个id分配给一个浮点数。我找不到任何相关的东西。既然其他人似乎都在使用这种方法,那么我一定会错过一些非常明显的东西吗?顺便说一句,基本SDK版本为4.3,带有XCode 4。
以下是我的BaseSDK /部署目标设置:
更新:我已经解决了。基本上问题是一些XCode问题。要解决其他一些问题,我必须卸载并重新安装XCode。之后,行为消失了。
答案 0 :(得分:1)
在iOS 3.2中,未定义符号-[UIScreen scale]
,因此编译器假定在使用iOS SDK 3.2进行编译时默认返回id
。因此警告。
了解SDK against which you compile and the deployment target的区别非常重要。您通常希望针对最新的SDK 编译,但是您要设置要支持的最低iOS版本的部署目标。
答案 1 :(得分:1)
这是我使用的代码,可以追溯到3.1(我之前没有测试过):
BOOL isRetina;
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2){
isRetina = YES;
} else {
isRetina = NO;
}
正如@DarkDust所指出的,问题不是你的代码(尽管上面的内容对你来说应该更简单),而是你正在尝试编译 for 3.2,而你真的是应该只是将部署目标设置为3.2,并使用最新的SDK进行编译。
不同之处在于,当您为较旧的SDK编译时,它将无法构建,因为它知道它无法调用该方法(scale
) - 即使它实际上不会到达那行代码。但是,如果您已正确设置部署目标,则可以在3.2上使用您的代码而不必担心,因为您知道scale
方法永远不会被调用,因为您确认它不存在。