2012-01-11 4 views
0

Если у меня есть метод и класс вроде этого:Внутри метода узнать объект, который вызвал этот метод?

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

@end 

Say У меня есть два других классов

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

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

без прохождения экземпляра «я» в движении, их каким-то образом получить доступ к я от движения?

+1

Там нет ничего подобного, что в языке - какие проблемы вы пытаетесь решать? –

+1

Возможный дубликат [Как узнать, кто вызвал метод?] (Http://stackoverflow.com/questions/1793999/how-to-find-out-who-called-a-method) также [Как узнать кто является вызывающим?] (http://stackoverflow.com/questions/1373991/) и хороший ответ от bbum в [Finding, откуда был вызван метод] (http://stackoverflow.com/questions/1614208/finding -где-а-метод был-называемый-с). –

+0

Передача 'sender' является распространенной идиомой при достижении этого. Например, подумайте о кнопке. Вы должны добавить обработчик к кнопке, и после выполнения действия на кнопке он вызывает обработчик, проходящий сам по себе как отправитель. – Jeremy

ответ

3

Вы не можете сделать это в Objective-C, единственная работа вокруг, я мог бы предложить, отправив ссылку отправителя, когда вы сообщение вашего класса, такие как:

@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 
Смежные вопросы