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

Ana*_*att 2 oop xcode objective-c selector ios

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

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

我认为这个例子非常简单,我只需要理解这一点,问题是,我怎么能从methodTwo中知道:哪个方法执行选择器,所以我从哪个方法调用methodTwo : .

提前致谢!

zrz*_*zka 6

如果你想知道哪个方法调用你的methodTwo,你可以查看调用堆栈.看这个 ...

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

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

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

0x014ef671 -[NSObject performSelector:] + 62
0x00002307 -[CMAppDelegate methodOne] + 55
Run Code Online (Sandbox Code Playgroud)

... callStackSymbols返回NSArray调用堆栈符号,因此,您可以查看索引1以获取您调用方法的方法.正如你所看到的,是NSObjectperformSelector,它是因为你所谓的methodTwo通过performSelector.如果你这样改变你methodOne...

-(void)methodOne {
  [self methodTwo:nil];
}
Run Code Online (Sandbox Code Playgroud)

...输出是......

0x000022fe -[CMAppDelegate methodOne] + 62
0x000025d6 -[CMAppDelegate application:didFinishLaunchingWithOptions:] + 374
Run Code Online (Sandbox Code Playgroud)

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