2

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

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

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

提前致谢!

4

3 回答 3

6

如果您确实想知道哪个方法调用了您的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 以获取您调用方法的方法。如您所见,有NSObject'sperformSelector是因为您调用了methodTwovia performSelector。如果你methodOne以这种方式改变你的...

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

...输出是...

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

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

于 2012-07-21T09:09:04.523 回答
2

尝试使用 performSelector:withObject:

-(void)methodOne {
   NSString *identifierStr = @"methodOne";
   [self performSelector:@selector(methodTwo:) withObject:identifierStr];
}
-(void)methodTwo:(NSString *)senderIdentifierStr {
   NSLog(@"Sent by %@",senderIdentifierStr);
}
于 2012-07-21T08:50:03.513 回答
1

您无法从第二种方法中知道哪个方法调用了它,至少在不通过调用堆栈(请参阅 参考资料NSThread)的情况下不能知道,但您可以从第一种方法中传递此信息,如下所示:

- (void)doSomething {
    [self doSomethingElseWithCallee: NSStringFromSelector(_cmd) andSender: self];
}

- (void)doSomethingElseWithCallee: (NSString *)selector andSender: (id)sender] {
    // Do something…
}

或者您可以立即传递选择器(类型SEL),而不是字符串:

- (void)doSomething {
    [self doSomethingElseWithCallee: _cmd andSender: self];
}

- (void)doSomethingElseWithCallee: (SEL)selector andSender: (id)sender] {
    // Do something…
}

顺便说一下, Objective-C 运行时与(当前对象)_cmd一起传递给您的方法的一个特殊参数。self它们不包含在您的方法签名中,但编译器会为您完成所有工作。;-)

所有人都为 Objective-C 语言欢呼!:-p

于 2012-07-21T09:10:02.133 回答