2012-01-11 17 views
0

私はこのようなメソッドとクラスを持っている場合:メソッド内で、そのメソッドを呼び出したオブジェクトを探しますか?

@implementation Animal 
    -(void) move{ 
    id *object = [object that called move]; 
    } 

@end 

は私が動きに「自己」のインスタンスを渡すことなく、2つの他のクラス

@implementation C1 
    ... 
    [self.animal move] 
    ... 
@end 

@implementation C2 
    ... 
    [self.animal move] 
    ... 
@end 

があると、へのアクセスを得るために彼らのいくつかの方法であります自己からの移動?

あなたはときのようなメッセージクラス、私が提案する可能性があり周りだけの仕事は、送信者の参照を送信していますが、Objective-Cでこれを行うことはできません
+1

言語でそのようなものはありません - あなたがしようとしているどのような問題解決する? –

+1

[誰がメソッドを呼び出したかを知る方法は?](http://stackoverflow.com/questions/1793999/how-to-find-out-who-called-a-method)[検索方法誰が呼び出し元ですか?](http://stackoverflow.com/questions/1373991/)、[メソッドがどこから呼び出されたかを見つける]のbbumからの素敵な答え(http://stackoverflow.com/questions/1614208/finding -where-a-method-called-from-from)を使用します。 –

+0

「送信者」を渡すことは、これを達成する際の一般的なイディオムです。例えば、ボタンを考えてみてください。ボタンにハンドラを追加し、ボタンに対してアクションを実行すると、ハンドラを送信側として渡します。 – Jeremy

答えて

3

@implementation Animal 
    -(void) move:(id)sender{ 
    id *object = [object that called move]; 
    } 

@end 

呼び出し:

@implementation C1 
    ... 
    [self.animal move:self]; 
    ... 
@end 

@implementation C2 
    ... 
    [self.animal move:self]; 
    ... 
@end 

次に、isMemberOfClass:またはisKindOfClass:を使用して、送信者のオブジェクトのタイプを判別できます。isKindOfClassは、問題のクラスが送信するクラスまたはそのサブクラスである場合にYESを返します。 isMemberOfClassに対し:あなたがメッセージングされているクラスは、あなたがそれを送信しているクラスのインスタンスである場合のみ、YESを返します

例:

A * aClass; // is just A 
[...] 

B * bClass; // is a subclass of A 
[...] 

[aClass isMemberOfClass:[A class]]; // YES 
[bClass isMemberOfClass:[A class]]; // YES 


[aClass isKindOfClass:[A class]]; // YES 
[bClass isKindOfClass:[A class]]; // NO 
関連する問題