2013-12-23 12 views
7

古いシステムで10.9でNSColorの新しく追加されたメソッドをサポートしようとしています。 Pre-10.9私はMacとiOSの間でコードを統一することができるカテゴリに入れました。 10.9にはこれらのメソッドがあるので、どこでも私は使い方が変わってしまいます。これらのメソッドを古いランタイムに動的に追加したいのですが、class_addMethodを使用してこれを行う方法についていくつかの参照が見つかりました。問題は、addMethodが成功を返しても、メソッドは呼び出されないということです。実行時にクラスにObjective-Cメソッドを追加する

NSColor * 
fColorWithWhite(id self, SEL _cmd, float white, float alpha) { 
    return [NSColor colorWithDeviceWhite: white 
            alpha: alpha]; 
} 

NSColor * 
fColorWithRedGreenBlue(id self, SEL _cmd, float red, float green, float blue, float alpha) { 
    return [NSColor colorWithDeviceRed: red 
           green: green 
            blue: blue 
           alpha: alpha]; 
} 

+ (void)addLegacySupport { 
    Class class = NSClassFromString(@"NSColor"); 

    BOOL success = class_addMethod(class, @selector(colorWithWhite:alpha:), (IMP)fColorWithWhite, "@@:ff"); 
    NSLog(@"colorWithWhite:alpha: - %i", success); 

    success = class_addMethod(class, @selector(colorWithRed:green:blue:alpha:), (IMP)fColorWithRedGreenBlue, "@@:ffff"); 
    NSLog(@"colorWithRed:green:blue:alpha: - %i", success); 
} 

いずれのポインタも高く評価されます。

答えて

4

。それらをメタクラスに追加する必要があります。

Class meta_cls = objc_getMetaClass("NSColor"); 
+0

これはとても驚きました。私はAPIドキュメントでそれを見ていないとは思えませんでしたが、class_addMethodでもfalseを返しました。 – greg

+0

解決済み:上記は機能しました。根本的な問題は、CGFloatをfloatに二重にキャストすることと関連していました。 – greg

6

class_addMethod()は、クラスにインスタンスメソッドを追加します。あなたはクラスメソッドを追加しようとしています。したがって、あなたは、引数としてクラスで​​3210を呼び出すことによって取得することができますメタクラス(classes are instances of their metaclasses)、にメソッドを追加する必要があります:あなたはクラスメソッドを追加しようとしている

Class metaclass = object_getClass(NSClassFromString(@"NSColor")); 

BOOL success = class_addMethod(metaclass, @selector(colorWithWhite:alpha:), (IMP)fColorWithWhite, "@@:ff"); 
+0

成功しません。 class_addMethodはfalseを返します。 – greg

+0

hh。それはここで働いている。あなたはどのSDKをテストしていますか?メソッドが既に存在する場合(つまり10.9の場合)は失敗します。 –

+0

私は実際にエラーを見てコード裏付けをしないように10.8に対してビルドしています。私は現時点で10.9を実行する前のシステムを持っていないので、リリース前にこれをうまくテストするためのベスト・ベットのように思えます。 – greg

関連する問題