iOS视网膜显示检测代码不起作用

| 我在检测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。之后,该行为消失了。     
已邀请:
在iOS 3.2中,未定义符号“ 1”,因此,当您使用iOS SDK 3.2进行编译时,编译器假定默认情况下它返回“ 2”。因此,警告。 了解编译所基于的SDK与部署目标之间的差异非常重要。通常,您希望针对最新的SDK进行编译,但是将部署目标设置为要支持的最低iOS版本。     
这是我使用的可追溯到3.1的代码(我还没有测试过):
BOOL isRetina;
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)] && [[UIScreen mainScreen] scale] == 2){
    isRetina = YES;
} else {
    isRetina = NO;
}
正如@DarkDust所指出的,问题实际上不是您的代码(尽管上面的代码对您来说更简单),而是您正在尝试针对3.2进行编译,而实际上您应该只是将部署目标设置为3.2并仍使用最新的SDK进行编译。 所不同的是,当您为较旧的SDK进行编译时,它将无法构建,因为它知道它无法调用该方法(ѭ4-),即使它实际上并没有到达该行代码。但是,如果您正确设置了部署目标,则可以在3.2上使用代码,不必担心,因为您知道
scale
方法将永远不会在不存在的地方被调用,因为您已验证它不存在。     

要回复问题请先登录注册