通过Objective-C中的类别有条件地覆盖系统方法?

有没有办法在系统中尚未定义方法时提供方法实现(与框架定义的方法具有完全相同的名称)?例如,方法[NSSomeClass someMethod:]仅存在于Mac OS X 10.6中,如果我的应用程序在10.5中运行,我将在类别中提供该方法的定义.但是当应用程序在10.6中运行时,我希望运行OS提供的方法.

背景:我正在创建一个针对10.5和10.6的应用程序.问题是我最近意识到方法[NSSortDescriptor sortDescriptorWithKey:ascending:]仅存在于10.6中,并且我的代码已经被该方法调用弄乱了.我可以为它提供一个默认实现(因为这次我自己实现起来并不太困难),但是我希望每当我的应用程序在10.6上运行时都会调用“本机”实现.此外,如果我将来遇到类似的问题(使用更难以实现的方法),我可能无法提供单线替换.

这个问题与Override a method via ObjC Category and call the default implementation?模糊地相似,但不同之处在于我只想在系统还没有实现时才提供实现.

谢谢.

解决方法

是的,这是可能的.由于你的目标是10.5我假设你正在使用ObjC2运行时,这使得它非常简单.

Objective-C Runtime Reference拥有您需要的所有方法.具体来说,您可以使用class_getClassMethod或class_getInstanceMethod来查看该方法是否已存在,然后使用class_addMethod将您的实现绑定到该选择器(如果该类尚未拥有它).

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...