Objective-c-posing
提供:Dev Guides
Objective-Cのポーズ
Objective-Cで Posing を開始する前に、Mac OS X 10.5で廃止が宣言されており、その後使用できないことをお知らせします。 したがって、これらの非推奨のメソッドを気にしない人はこの章を飛ばすことができます。
Objective-Cでは、クラスがプログラム内の別のクラスを完全に置き換えることができます。 置き換えクラスは、ターゲットクラスを「装う」と言われます。 ポーズをサポートしたバージョンの場合、ターゲットクラスに送信されたすべてのメッセージは、代わりにポーズクラスによって受信されます。
NSObjectには、上記のように既存のクラスを置き換えることができるposeAsClass −メソッドが含まれています。
ポーズの制限
- クラスは、直接または間接のスーパークラスの1つとしてのみポーズをとることができます。
- ポーズクラスは、ターゲットクラスにない新しいインスタンス変数を定義してはなりません(ただし、メソッドを定義またはオーバーライドできます)。
- ターゲットクラスは、ポーズの前にメッセージを受信していない可能性があります。
- ポーズをとるクラスは、superを介してオーバーライドされたメソッドを呼び出すことができるため、ターゲットクラスの実装を組み込むことができます。 *ポーズクラスは、カテゴリで定義されたメソッドをオーバーライドできます。
#import <Foundation/Foundation.h>
@interface MyString : NSString
@end
@implementation MyString
- (NSString* )stringByReplacingOccurrencesOfString:(NSString *)target
withString:(NSString *)replacement {
NSLog(@"The Target string is %@",target);
NSLog(@"The Replacement string is %@",replacement);
}
@end
int main() {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[MyString poseAsClass:[NSString class]];
NSString* string = @"Test";
[string stringByReplacingOccurrencesOfString:@"a" withString:@"c"];
[pool drain];
return 0;
}
古いMac OS X(V_10.5以前)でプログラムをコンパイルして実行すると、次の結果が得られます。
2013-09-22 21:23:46.829 Posing[372:303] The Target string is a
2013-09-22 21:23:46.830 Posing[372:303] The Replacement string is c
上記の例では、元のメソッドを実装で汚染しただけで、上記のメソッドを使用したすべてのNSString操作で影響を受けます。