・・・もじにするとなんかわかりにくいので、説明書いちゃう
使うメソッド
- (BOOL)respondsToSelector:(SEL)aSelector
メソッドがあるかどうかチェックする
- (id)performSelector:(SEL)aSelector
メソッドを実行する
この2つを使って、あるオブジェクトに対して、実行したいメソッドがあるか
チェックしてから、そのメソッドがあったときだけ実行するようにする。
まず、こんな感じのクラスを定義しておく。
サンプルクラス"MyObject"
@interface MyObject: NSObject{
}
@end
@implementation MyObject
- (id)init{
self = [super init];
return self;
}
- (void)test1{
NSLog(@"test1 exec");
}
- (void)test2:(NSString*)str{
NSLog(@"test2 exec %@", str);
}
- (int)test3{
return 1;
}
@end
test1はふつーに文字を出力する。
test2は文字列をわたされるので、それを結合して出力する。
test3は戻り値(=1)を返す。
このクラスに対して、さっきのを使って実行してみる。
実装
MyObject* obj = [[MyObject alloc]init];
if ([obj respondsToSelector:@selector(test1)]){
[obj performSelector:@selector(test1)];
}
if ([obj respondsToSelector:@selector(test2:)]){
[obj performSelector:@selector(test2:) withObject:@"TEST"];
}
if ([obj respondsToSelector:@selector(test3)]){
int ret3 = (int)[obj performSelector:@selector(test3)];
NSLog(@"return3 = %d", ret3);
}
if ([obj respondsToSelector:@selector(test4)]){
int ret4 = (int)[obj performSelector:@selector(test4)];
NSLog(@"return = %d", ret4);
}
test1, test2, test3, test4という4つのメソッドを実行しようとする。
test4はないので、実行されない。
出力
2012-03-28 01:40:25.268 Sample120222[71784:207] test1 exec
2012-03-28 01:40:25.269 Sample120222[71784:207] test2 exec TEST
2012-03-28 01:40:25.270 Sample120222[71784:207] return3 = 1
メソッドのあるなしを判定してから実行できるので、必要なメソッドだけ定義しておいて、
あったらやる、なかったらスルー、みたいなことをそれぞれのクラスに対して実行できるので、
とーっても便利

・・・っていえるほどうまく使えたことないのだけど、
うまくつかえたらかっこいいー!
・・・かも?