2

過去のプロジェクト(iOS 4.0より前)では、次のカテゴリメソッドを次のように記述しましたNSSortDescriptor

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

AppleがiOSSDK4.0をリリースしたとき、それはまったく同じ方法を含んでいました(おそらくまったく同じことをします)。特定のOSバージョンを実行している場合、または同じシグネチャで宣言されたメソッドがまだない場合は、おそらくそれ以上にランタイムに追加されるカテゴリを作成することは可能ですか?

この場合、sortDescriptorWithKey:ascending:私のバージョンはほぼ確実に同じことを行うので、メソッドをカテゴリでオーバーライドするのがおそらく安全です。これにより、iOS3とiOS4の両方がサポートされます。エッジケースで物事を壊す可能性があるため、可能であればシステム定義のメソッドをいじりたくないです。

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:これは、AppStoreの提出に関してAppleによって眉をひそめられる可能性があります。

于 2010-12-10T03:49:03.007 に答える
4

直接ではありません。

これを行うことをお勧めする方法はmy_sortDescriptorWithKey:、クラスが応答するかどうかをチェックし、応答する場合はsortDescriptorWithKey:それを使用することができるようにすることです。そうでない場合は、独自の実装を使用します。

于 2010-12-10T03:42:57.923 に答える