2

在过去的项目中(iOS 4.0 之前),我在 上编写了以下类别方法NSSortDescriptor

+ (id)sortDescriptorWithKey:(NSString *)key ascending:(BOOL)ascending;

当 Apple 发布 iOS SDK 4.0 时,它包含了完全相同的方法(大概做了完全相同的事情)。如果您正在运行特定的操作系统版本,或者可能更重要的是,如果还没有使用相同签名声明的方法,是否可以编写一个仅添加到运行时的类别?

在这种情况下,使用类别覆盖该sortDescriptorWithKey:ascending:方法可能是安全的,这将同时支持 iOS 3 和 iOS 4,因为我的版本几乎肯定会做同样的事情。如果可能的话,我仍然宁愿不要乱用系统定义的方法,因为在极端情况下(不太可能)可能会破坏东西。

4

2 回答 2

5

Joshua 的回答会很好用,但是如果你想变得非常花哨,你可以使用 Objective-C 的动态特性来修改NSSortDescriptor你喜欢的类:

#import <objc/runtime.h>

SEL theSelector = @selector(sortDescriptorWithKey:ascending:);

if ( ! [NSSortDescriptor instancesRespondToSelector:theSelector]) {
    class_addMethod([NSSortDescriptor class],
                    theSelector,
                    (IMP)mySortDescriptorWithKey,
                    "@@:@B");
}

当然,这取决于 C 函数:

id mySortDescriptorWithKeyAscending(id self, SEL _cmd, NSString *key, BOOL ascending) {
    // Put your code here.
}

免责声明:我没有尝试编译任何这些。

免责声明 II:就 App Store 提交而言,Apple 可能不赞成这一点。

于 2010-12-10T03:49:03.007 回答
4

不直接,不。

我建议这样做的方法是有一个my_sortDescriptorWithKey:which 可以检查该类是否响应sortDescriptorWithKey:并使用它,如果它响应,则使用您自己的实现。

于 2010-12-10T03:42:57.923 回答