2012-01-11 59 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 
相關問題