Hatena::ブログ(Diary)

このブログは証明できない。

2010-06-04

[]Objective-Cで、参照先のオブジェクトから参照元に通知を送る方法。

BarがFooを参照している場合、オブジェクト間のメッセージパッシングは、基本的にBarからFooへのメソッド呼び出しとなります。逆に、FooからBarにメッセージを送りたいときはどうすればいいでしょうか。C#では、デリゲートやイベントという便利な仕組みが用意されています。Objective-Cの場合は、C#よりも面倒なのですが、下のように書くといいようです。


FooからBarに送るメッセージです。SampleDelegate.h

@protocol SampleDelegate <NSObject>

@optional

- (void)objectChanged:(id)sender;

@end

メッセージを送る方です。Foo.h

@interface Foo : NSObject {
    id delegate;
}

@property (assign, readwrite) id delegate;

@end

Foo.m

@implementation Foo

@synthesize delegate;

- (void)test {
    // do something

    [self notifyObjectChanged];

    // do something
}

- (void)notifyObjectChanged {
    if (self.delegate != nil) {
        if ([self.delegate conformsToProtocol:@protocol(SampleDelegate)]) {
            if ([self.delegate respondsToSelector:@selector(objectChanged:)]) {
                [self.delegate objectChanged:self];
            }
        }
    }
}

@end

メッセージを受け取る方です。Bar.h

@interface Bar : NSObject <SampleDelegate> {
}

@end

Bar.m

@implementation Bar

- (void)test {
    Foo *f = [[Foo alloc] init];
    f.delegate = self;
}

- (void)objectChanged:(id)sender {
    // do something
}

@end

頑張ります。何かを。




参考(2010-08-31):




詳解 Objective-C 2.0

詳解 Objective-C 2.0

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証