カテゴリを使用してメソッドをオーバーライドすることは推奨されない方法であることを理解しています。それにもかかわらず、これを行うコードを処理する必要があります。次のコードを実行したとき、カテゴリ メソッドが両方のケースで呼び出されたことに最初は驚きましたが、リンカーが特定のシンボルのリンク時にどのように決定を下さなければならないかを考えると、気分が良くなりました。
私の質問: 私が作成したもの以外に他のカテゴリが使用されていないと仮定すると、ヘッダーがどこかからインポートされている限り、私のカテゴリの実装は常に呼び出されるロジックであることが保証されますか?
someObject.h
#import <Foundation/Foundation.h>
@interface SomeObject : NSObject
- (void)doSomething;
@end
someObject.m
#import "SomeObject.h"
@implementation SomeObject
- (void)doSomething
{
NSLog(@"Original");
}
@end
someObject+Cat.h
#import <Foundation/Foundation.h>
#import "SomeObject.h"
@interface SomeObject (SomeObject)
- (void)doSomething;
@end
someObject+Cat.m
#import "SomeObject+Cat.h"
@implementation SomeObject (SomeObject)
- (void)doSomething
{
NSLog(@"New!");
}
@end
someObjectUser.h
#import <Foundation/Foundation.h>
@interface SomeObjectUser : NSObject
- (void)useSomeObject;
@end
someObjectUser.m
#import "SomeObjectUser.h"
#import "SomeObject.h"
@implementation SomeObjectUser
- (void)useSomeObject
{
[[SomeObject new] doSomething];
}
@end
Test.m
- (void)testExample
{
[[SomeObject new] doSomething];
[[SomeObjectUser new] useSomeObject];
}
結果
2013-02-28 11:32:37.417 CategoryExample[933:907] New!
2013-02-28 11:32:37.419 CategoryExample[933:907] New!