私は2つのクラス、ClassBをインスタンス化し、デリゲートとしてメソッドを渡すClassAを持っています。 ClassBは最終的にClassAの代理人を呼び出します。 ClassBに保存するときにClassAに保持を追加する必要がありますか?ObjectiveCでカスタムクラスのデリゲートを実装するときの参照カウント
"Cocoa Fundamentals Guide:オブジェクトとの通信"の "カスタムクラスの代理人の実装"に従っていますが、デモンストレーションされたサンプルコードではメモリ管理を考慮していないようです。
にClassAは、デリゲートを設定し、ClassBのは、それの仕事で行われたとき、後にコールバックされることを期待します。
@implementation ClassA
-(void)launchSomething
{
ClassB *classB = [[ClassB alloc] init];
[classB setCallback:self withSelector:@selector(deferredWork)];
// do some other stuff, assign class B to some View and eventually release class B
}
-(void)deferredWork
{
NSLog(@"this is the method that will be deferred till some point in time");
}
保存し、後で、デリゲートを呼び出しますClassBのためのヘッダファイル:
@interface ClassB
id targetObject;
SEL targetMethod;
-(void) setCallback:(id)anObject withSelector:(SEL)aMethod
ClassBのの実装:
@implementation ClassB
-(void) setCallback:(id)anObject withSelector:(SEL)aMethod
{
// QUESTION: Do I need to add a 'retain' here on the targetObject?
targetObject = anObject;
targetMethod = aMethod;
}
-(void) someWorkLater
{
if ([targetObject respondsToSelector:@selector(targetMethod)]) {
// invoke the target object with the specific method
[targetObject targetMethod];
}
}