3

我的 iPhone 应用程序有一个登录视图控制器,可在需要登录时弹出。用户登录后,我有这个:

    if ([self.presentingViewController respondsToSelector:@selector(userDidLogin)]) {
        [((id)self.presentingViewController) userDidLogin];
    } else {
        [self.presentingViewController dismissModalViewControllerAnimated:YES];            
    }

但是,编译器一直抱怨“选择器 userDidLogin 没有已知的实例方法”。然后我添加了一个名为userDidLogin登录视图控制器的实例方法,当然不是self.presentingViewController,然后构建成功。

这种解决方法对我来说是不合理的。它是 Xcode 中的错误还是预期的行为?是后者吗,原理是什么?

4

1 回答 1

4

编译器需要知道userDidLogin选择器的返回类型,以便生成正确的代码:

  • 如果消息返回结构,编译器可能需要生成对objc_msgSend_stret. (来源:Greg Parker 的博客。)
  • 如果消息返回浮点数,编译器需要(在某些平台上)生成对objc_msgSend_fpret. (来源:Greg Parker 的博客。)
  • 否则,编译器需要生成对objc_msgSend.

选择userDidLogin器没有参数,但如果选择器确实有参数,编译器还需要知道声明的参数类型,以便正确传递参数。

此外,如果您使用 ARC,编译器需要知道选择器的返回类型和所有权注释,以便它可以在适当时生成返回值的释放。

处理这个问题的常用方法只是#import声明userDidLogin消息的类的头文件。只要编译器看到选择器在某处声明,它就不会抱怨将其发送到id.

于 2012-09-15T06:35:30.583 回答