objective-c - 如何知道在 Objective-C 中哪个方法执行了选择器

标签 objective-c ios xcode oop selector

我有一个非常简单的示例,但我无法理解如何获取有关在其中调用选择器的方法的信息。例如:

-(void)methodOne {
   [self performSelector:@selector(methodTwo:)];
}
-(void)methodTwo:(id)sender {
   //How to know which method performed selector???
}

我觉得这个例子很简单,我只需要理解这一点,再一次,问题是,我怎么知道 methodTwo: 哪个方法执行选择器,所以我从哪个方法调用 < strong>方法二:.

提前致谢!

最佳答案

如果您想知道哪个方法调用了您的methodTwo,您可以查看调用堆栈。看看这个……

-(void)methodOne {
  [self performSelector:@selector(methodTwo:)];
}

-(void)methodTwo:(id)sender {
  NSLog( @"%@", [NSThread callStackSymbols][1]);
  NSLog( @"%@", [NSThread callStackSymbols][2]);
}

... 日志输出(简化)是...

0x014ef671 -[NSObject performSelector:] + 62
0x00002307 -[CMAppDelegate methodOne] + 55

... callStackSymbols 返回带有调用堆栈符号的 NSArray,因此,您可以查看索引 1 以获取调用您的方法的方法。如您所见,有 NSObjectperformSelector,这是因为您通过 performSelector 调用了 methodTwo。如果您以这种方式更改您的 methodOne ...

-(void)methodOne {
  [self methodTwo:nil];
}

...输出是...

0x000022fe -[CMAppDelegate methodOne] + 62
0x000025d6 -[CMAppDelegate application:didFinishLaunchingWithOptions:] + 374

...就是这样。您的问题已得到解答,但我不知道您为什么要这个。您可能不想知道究竟是哪个方法调用了您的方法,而是哪个对象启动了这个调用链。一个例子是按钮 - 您可以使用一种方法来处理更多按钮,并且有 sender 参数来区分这些按钮,正如@stavash 指出的那样。

关于objective-c - 如何知道在 Objective-C 中哪个方法执行了选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11590725/

相关文章:

ios - removeFromSuperview 函数不能正常工作

swift - XCode 9 Swift 4 中没有这样的模块 'FBAudienceNetwork'

ios - OpenGL ES 2.0-纹理四边形

objective-c - 使用 NSDictionary 将索引存储为值来加快 NSArray 查找

android - 应用商店/市场 : migrate existing user base

ios - Xcode 9.0 和 Firebase 5.0.4 上的位码版本无效

ios - 如何在 Xcode 中将声音文件添加到您的包中?

iOS:如何判断按钮是否被拖入指定区域

ios - 获取 UIBarButtonItem 图像相对于 iOS 7 中导航栏的位置

ios - 将 NSArray 转换为 NSSortDescriptor