Mac OS X开发中在程序运行时判断某个API是否存在
来源:互联网 发布:材料力学800题淘宝 编辑:程序博客网 时间:2024/05/16 01:28
Mac OS开发经常碰到的一个问题是,Apple特有的API的更新换代很快,一个API去年还用得好好的,在今年新发布的OS版本中就被弃用了,换成一个新的API。为了实现相应的功能,又为了使用程序能够同时支持老版本和新版本,程序中必须确保在新老版本OS中用对正确API。
对于Objective-C类来说,如果是某个类的成员函数被弃用,可以调用类的静态函数respondsToSelector在运行时判断某个成员函数是不是可用。该函数继承自NSObject类,因此所有NSObject的子类都可以使用这个方法很简单地进行判断。例子如下:
if([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) [doneButton setContentEdgeInsets:UIEdgeInsetsMake(0, 12, 0, -12)];
但如果是一些C函数,就没有这么简单的方法了。能想到的最直接了当地方法就是获得当前OS的版本号,然后根据OS版本号决定用哪套API。但这个方法麻烦不说,看起来也不像一个像样的方法,总感觉跟补丁似的。
在Apple的开发文档里找到了简单的解决方案。如下:
重新声明函数原型。具体地说就是在函数原型后加上__attribute__((weak_import)),以表明该符号对该链接适用弱引用(weak reference)。
CFURLRef LSSharedFileListItemCopyResolvedURL( LSSharedFileListItemRef inItem, LSSharedFileListResolutionFlags inFlags, CFErrorRef * outError) __attribute__((weak_import));对于弱引用的符号,dyld在链接时会把它的地址置为NULL。然后在程序中只面要根据地址是否为空,就知道它是不是可用了。
if (&LSSharedFileListItemCopyResolvedURL){ thePath = LSSharedFileListItemCopyResolvedURL(itemRef, 0, NULL);}
0 0
- Mac OS X开发中在程序运行时判断某个API是否存在
- 如何在tiptop 4GL程序中判断客户端机器某个文件是否存在
- 在脚本(script)中判断某个命令是否存在
- shell script里面判断某个程序是否还在运行
- 使用HISS判断某个程序是否在运行
- 判断数据库中是否存在某个表
- 判断dataset中是否存在某个表?
- 判断ACCESS中是否存在某个表
- 判断字符串中是否存在某个字符
- 判断应用中某个activity是否存在
- 判断List中是否存在某个值
- 判断程序是否在虚拟机中运行
- COCOSDX2.2如何在Mac OS X 中运行Lua (Running Lua on Mac OS X)
- 如何在Mac OS X 中运行Lua (Running Lua on Mac OS X)
- 如何在Mac OS X 中运行Lua (Running Lua on Mac OS X)
- 在MAC OS X 开发中,如何让程序有多线程?方法1
- 判断是否已经运行了某个程序
- 批处理(bat)判断某个程序是否运行
- 天声人語 20150108
- 华为机试—输出第n个丑数
- CentOs中文无法显示的问题
- 第20周-输出一定范围内的素数
- MSSQL-xp_cmdshell 的利用
- Mac OS X开发中在程序运行时判断某个API是否存在
- 医学影像调窗技术
- 基于java config的springSecurity(一)--基本搭建
- Pascal's Triangle
- 海量数据处理
- LeetCode(8) String To Integer(atoi)
- Pascal's Triangle II
- MySQL查看当前用户、存储引擎、日志
- Linux下DedeCMS详细安全设置教程