2012-01-11 58 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 

,而没有经过实例“自我”为举措,是他们的一些方式来获得访问自我移动?

+1

有没有像在语言 - 哪些问题是你想解决? – 2012-01-11 20:13:20

+1

[如何找出谁称为方法?](http://stackoverflow.com/questions/1793999/how-to-find-out-whocalled-a-method)[如何找出谁是调用者?](http://stackoverflow.com/questions/1373991/)和一个很好的答案来自[查找从哪里调用方法](http://stackoverflow.com/questions/1614208/finding -where-A-方法-被称为-从)。 – 2012-01-11 20:16:13

+0

传递'发件人'是达到此目的的常见习惯用语。例如,考虑一个按钮。您将为该按钮添加一个处理程序,并且在对该按钮执行操作时,它会调用将自己作为发件人传递的处理程序。 – Jeremy 2012-01-11 20:19:41

回答

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 
相关问题