2015-07-21 63 views
2

在xcode中,我可以使用圖片中的按鈕找到給定方法的調用者。Xcode/Objective-c - 如何以編程方式查找給定方法的調用者

運行時可以做到嗎?

喜歡的東西:

-(NSArray *)getCallersOfFoo { 

    // is it possible to find the callers of the method foo? 

} 

-(void)foo {...} 

enter image description here

+0

也許這可以幫助http://stackoverflow.com/questions/11916016/how-does-the-objective-c-runtime-retrieve-the-list-of-classes-and-methods – iamIcarus

+0

這是Xcode是從代碼的「外部」視角做的。它通過部分編譯來分析源代碼。程序通常不能在運行時自行完成,主要是因爲源代碼不可用。你需要解釋你爲了獲得有意義的答案而要做的事情的高層目的。 –

+0

我想調整方法併爲特定調用者執行一些代碼 –

回答

0

簡短的回答:沒有。

漫長的回答:好的,你可以調用堆棧,然後花更多的精力去利用你所得到的東西。但這很可能不是你想要的。

通常,該方法不應該在乎它如何被調用。

+0

我同意它不應該。但是我正在編寫一個需要分析代碼的工具。 –

0

不完全是答案,但它可能有幫助。這個方法會在調試區給你打印堆棧或調用者。您可以修改它們,當然可以隨心所欲地使用這些值。

代碼是一種'被盜',但我沒有參考從哪裏。

#define SHOW_STACK NSLog(@"%@",[NSThread callStackSymbols]) 

#define SHOW_CALLER \ 
do {    \ 
NSArray *syms = [NSThread callStackSymbols]; \ 
if ([syms count] > 1) { \ 
    NSLog(@"<%@ %p> %@ - caller: %@ ", [self class], self, NSStringFromSelector(_cmd),[syms objectAtIndex:1]); \ 
} else { \ 
    NSLog(@"<%@ %p> %@", [self class], self, NSStringFromSelector(_cmd)); \ 
} \ 
} while(0) 

編輯:你可能會想是這樣的:

NSString *caller = nil; 
NSArray *syms = [NSThread callStackSymbols]; 

if (syms.count > 1) 
{ 
    caller = syms[1]; 
} 

if (caller.length) 
{ 
    NSLog(@"%s called by %@", 
      __PRETTY_FUNCTION__, 
      caller); 
} 

another Q&A here on SO你可能會發現非常有用的。

+0

爲什麼不是我想要的可能?這會給第一個來電者不是嗎? –

+0

我沒有說這是不可能的。我只是說我的答案還沒有準備好使用:) –

相關問題