0

重複の可能性:
2 つの ObjC カテゴリが同じメソッドをオーバーライドするとどうなりますか?

次のように、NSString クラスに 2 つのカテゴリがあります。

//最初のカテゴリ

#import "NSString+MyCategory1.h"

@implementation NSString (MyCategory1)

-(void)myMethod{
    NSLog(@"this is my method from category 1");
}

@end

// 2 番目のカテゴリ

#import "NSString+MyCategory2.h"

@implementation NSString (MyCategory2)

-(void)myMethod{
    NSLog(@"this is my method from category 2");
}

@end

ただし、次の main メソッドは、同じもののインポートがコメントアウトされた後でもmyMethod常に呼び出しています。MyCategory1

#import <Foundation/Foundation.h>
//#import "NSString+MyCategory1.h"
#import "NSString+MyCategory2.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        [[[NSString alloc]init] myMethod];

    }
    return 0;
}

この動作と、この動作が実際にどのように役立つかを誰かに説明してください。

4

1 に答える 1

4

これが示しているのは、衝突するカテゴリにメソッドを持つべきではないということだと思います。

私の (ある程度の情報に基づいた) 推測では、アプリがどのようにコンパイルされたかによってどのメソッドが呼び出されるかということです。そのため、実行時に影響を与えることはできません。そして、それは実際にはあまり役に立ちません。ただ...何が起こるかです。

これが発生する理由については、ヘッダー ファイルには、メソッドが呼び出されたときに何をすべきかが示されておらず、メソッドの実装が存在することだけが示されています。あなたの場合、それは存在します。たまたまあなたが望むものではないのです。

于 2012-11-08T13:24:03.213 に答える