Objective-C:如何检查 C 函数是否受支持

发布于 2024-11-19 12:30:19 字数 310 浏览 4 评论 0原文

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

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

How can I perform a run-time check to see if I can use UIGraphicsBeginImageContextWithOptions, which is only available starting with iOS 4.

I know I could check [[UIDevice currentDevice] systemVersion], but Apple recommends using things like NSClassFromString() or respondsToSelector:. Is there a respondsToSelector: for C functions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

南街九尾狐 2024-11-26 12:30:19

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

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);
}

另请参阅: 如何在 Xcode 4 上使用弱链接框架?

Here's another option, which I've been using.

C functions are pointers. If you "weak" link to UIKit framework, on iOS 3 the function pointer will simply be NULL, so you can test for the existence of the function by doing:

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

See also: How do I weak link frameworks on Xcode 4?

一江春梦 2024-11-26 12:30:19

您可能感兴趣的是 弱链接。 (参见“清单 3-2:检查 C 函数的可用性”。)

What you're probably interested in here is weak linking. (See "Listing 3-2: Checking the availability of a C function".)

苏辞 2024-11-26 12:30:19

这就是我的想法:

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

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

This is what I'm going with:

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

I think this is good enough, but if you have any better suggestions, please answer.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文