【问题标题】:Objective-C: How to check if a C function is supportedObjective-C:如何检查是否支持 C 函数
【发布时间】:2011-10-01 10:15:22
【问题描述】:

我如何执行运行时检查以查看我是否可以使用 UIGraphicsBeginImageContextWithOptions,它仅从 iOS 4 开始可用。

我知道我可以查看[[UIDevice currentDevice] systemVersion],但Apple 建议使用NSClassFromString()respondsToSelector: 之类的内容。 C 函数有 respondsToSelector: 吗?

【问题讨论】:

    标签: iphone objective-c cocoa-touch respondstoselector


    【解决方案1】:

    这是我一直在使用的另一个选项。

    C 函数是指针。如果你“弱”链接到 UIKit 框架,在 iOS 3 上,函数指针将只是 NULL,所以你可以通过以下方式测试函数是否存在:

    if (UIGraphicsBeginImageContextWithOptions)
    {
        // On iOS 4+, use the main screen's native scale factor (for iPhone 4).
        UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
    }
    else
    {
        UIGraphicsBeginImageContext(size);
    }
    

    另请参阅:How do I weak link frameworks on Xcode 4?

    【讨论】:

      【解决方案2】:

      您可能对这里感兴趣的是weak linking。 (参见“清单 3-2:检查 C 函数的可用性”。)

      【讨论】:

        【解决方案3】:

        这就是我要去的:

        if ([mainScreen respondsToSelector:@selector(scale)]) {
            UIGraphicsBeginImageContextWithOptions(newSize, NO, [[UIScreen mainScreen] scale]);
        } else {
            UIGraphicsBeginImageContext(newSize);
        }
        

        我觉得这已经足够好了,但是如果您有更好的建议,请回答。

        【讨论】:

        • iOS 3.2 上存在该 scale 调用,它具有未记录的“scale”方法......因此“respondsToSelector”将起作用,但 UIGraphicsBeginImageContextWithOptions 调用仅在 iOS 4.0 以后可用。因此它会在原始未升级的 iPad 上崩溃。我会使用 Daniels 检查,您应该始终检查您将要拨打的确切呼叫,而不是像这样依赖呼叫检查的“配对”。
        猜你喜欢
        • 2012-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-13
        相关资源
        最近更新 更多