NSObjectの機能を使ってメソッドを実行してみる | ゆぅさんのiPhone開発技術関連ブログ

ゆぅさんのiPhone開発技術関連ブログ

iPhone開発についての技術まわりのことを切り出して書き込みします。

NSObjectのメソッドを使って、なんかのオブジェクトのメソッドを実行してみるときのめもも。

・・・もじにするとなんかわかりにくいので、説明書いちゃう


使うメソッド


- (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




メソッドのあるなしを判定してから実行できるので、必要なメソッドだけ定義しておいて、
あったらやる、なかったらスルー、みたいなことをそれぞれのクラスに対して実行できるので、
とーっても便利晴れ

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

・・・かも?