2012-01-11 4 views
0

나는이 같은 방법 및 클래스가있는 경우 :메서드 내에서 해당 메서드를 호출 한 개체를 찾으십시오?

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

@end 

말을 나는 이동에 인스턴스 '자기'를 통과하지 않고 두 개의 다른 클래스

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

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

이는에 접근하는 그들의 몇 가지 방법입니다 움직이기 때문에 자기? 당신은 목표 - C에서이 작업을 수행 할 수

+1

언어처럼 아무것도 없다 - 당신은 무엇을하려고하는 문제 풀다? –

+1

[누가 메소드를 호출했는지 알아 보는 방법?] (http://stackoverflow.com/questions/1793999/how-to-find-out-who-called-a-method) [검색 방법 누가 호출자인가?] (http://stackoverflow.com/questions/1373991/)와 [breen에서 좋은 대답은 어디에서 호출 된 방법 찾기] (http://stackoverflow.com/questions/1614208/finding) -where-a-method---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 
관련 문제