Archive for 4月, 2010

Objective-Cのお勉強 #3 セレクタ

iPhone SDK アプリケーション開発ガイドを読んでいた昨今、ど〜しても理解しがたかったのが、メソッド宣言してなくて、しかもそのメソッドが書かれている箇所より上のメソッドより上から呼び出されていて、それがすんなり通る。
でも、その呼び方が不自然で、

[self hoge];

などじゃなく、

        hogeButton = [[UIBarButtonItem alloc] initWithTitle:@"Hoge"
style:UIBarButtonItemStylePlain
target:appDelegate
action:@selector(hoge)];

と言う書き方。
ちなみに、これはアプリケーション開発ガイドのPageDemoと言うプログラムで見ることが出来る。

で、@selectorと言うのがどうにも怪しいので詳解 Objective-C 2.0を手に取る。
で、こんなメソッドが用意されているらしい。

// 引数無し実行
- (id)performSelector:(SEL)aSelector;
// 引数あり実行
- (id)performSelector:(SEL)aSelector withObject:(id)anObject;

こんな感じで呼べるらしい。

内容読んだら関数ポインタをダイナミックにしたような物、と言う雰囲気。
実感湧かないから書いてみることに。
hoge.h

// hoge.h
#import <Foundation/NSObject.h>
@interface Hoge : NSObject
- (void) foo;
@end
@interface Moge : NSObject
@end

hoge.m

// hoge.m
#import "hoge.h"
#import <stdio.h>
@implementation Hoge
- (void) foo {
printf( "Message from Hoge's foo.\n" );
// このコードは動かないから、コメントアウト。
//[self bar];
// このコードは動く
[self performSelector:@selector(bar)];
// モゲが動く
id moge = [[Moge alloc] init];
[moge performSelector:@selector(bar)];
[moge dealloc];
// ホゲが動く
moge = self;
[moge performSelector:@selector(bar)];
}
- (void) bar {
printf("Message from Hoge's bar.\n");
}
@end
@implementation Moge
- (void) bar {
printf("Message from Moge's bar.\n");
}
@end

main.m

main.m
#import "hoge.h"
int main()
{
// idと言う型の変数を定義します
id obj;
// クラスのインスタンス化
obj = [[Hoge alloc] init];
// メソッド呼び出し
[obj foo];
[obj dealloc];
return 0;
}

実行結果

McLaren% gcc -o hoge_test main_hoge.m hoge.m -framework Foundation
McLaren% ./hoge_test
Message from Hoge's foo.
Message from Hoge's bar.
Message from Moge's bar.
Message from Hoge's bar.

なるほどね。。
俺ほどの実力になると、使い時さえ思いつかないと言う有様。
精進します。。。

そんだけ。

Post to Twitter

,

No Comments