2

我在检测 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/部署目标设置: SDK 设置

更新:我已经解决了。基本上问题是一些 XCode 问题。为了解决其他一些问题,我必须卸载并重新安装 XCode。之后这种行为就消失了。

4

2 回答 2

1

这是我使用的代码,它可以追溯到 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 进行编译时,它将无法构建,因为它知道它不能调用该方法 ( scale) - 即使它实际上不会到达那行代码。但是,如果您正确设置了部署目标,则可以在 3.2 上使用您的代码而不必担心,因为您知道该scale方法永远不会在它不存在的地方被调用,因为您验证了它不存在。

于 2011-04-14T14:11:39.780 回答
1

在 iOS 3.2 中,符号-[UIScreen scale]未定义,因此id当您使用 iOS SDK 3.2 编译时,编译器假定它默认返回。因此发出警告。

了解编译所针对的 SDK 和部署目标的区别非常重要。您通常希望针对最新的 SDK进行编译,但您将部署目标设置为您想要支持的最低 iOS 版本。

于 2011-04-14T14:06:36.903 回答