在xcode中,我可以使用圖片中的按鈕找到給定方法的調用者。Xcode/Objective-c - 如何以編程方式查找給定方法的調用者
運行時可以做到嗎?
喜歡的東西:
-(NSArray *)getCallersOfFoo {
// is it possible to find the callers of the method foo?
}
-(void)foo {...}
在xcode中,我可以使用圖片中的按鈕找到給定方法的調用者。Xcode/Objective-c - 如何以編程方式查找給定方法的調用者
運行時可以做到嗎?
喜歡的東西:
-(NSArray *)getCallersOfFoo {
// is it possible to find the callers of the method foo?
}
-(void)foo {...}
簡短的回答:沒有。
漫長的回答:好的,你可以調用堆棧,然後花更多的精力去利用你所得到的東西。但這很可能不是你想要的。
通常,該方法不應該在乎它如何被調用。
我同意它不應該。但是我正在編寫一個需要分析代碼的工具。 –
不完全是答案,但它可能有幫助。這個方法會在調試區給你打印堆棧或調用者。您可以修改它們,當然可以隨心所欲地使用這些值。
代碼是一種'被盜',但我沒有參考從哪裏。
#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你可能會發現非常有用的。
爲什麼不是我想要的可能?這會給第一個來電者不是嗎? –
我沒有說這是不可能的。我只是說我的答案還沒有準備好使用:) –
也許這可以幫助http://stackoverflow.com/questions/11916016/how-does-the-objective-c-runtime-retrieve-the-list-of-classes-and-methods – iamIcarus
這是Xcode是從代碼的「外部」視角做的。它通過部分編譯來分析源代碼。程序通常不能在運行時自行完成,主要是因爲源代碼不可用。你需要解釋你爲了獲得有意義的答案而要做的事情的高層目的。 –
我想調整方法併爲特定調用者執行一些代碼 –