Objective-C属性getter抛出异常'无法识别的选择器发送到实例'

时间:2013-12-05 05:57:08

标签: ios objective-c properties unrecognized-selector

我是Objective-C的新手。我在尝试使用属性getter时遇到了问题。我有一个属性来访问一个非常简单的类的实例。我的界面如下所示:

@interface AppDelegate : UIResponder <UIApplicationDelegate>
//...
@property (strong, nonatomic, readonly) MyController* myController;
@end

我的实现看起来像这样:

@implementation AppDelegate
{
}

@synthesize myController = _myController;
....
//Getter
- (MyController*)myController
{
    return _myController;
}
@end

在我的项目的其他地方,我正在尝试使用getter。它悲惨地失败了。

AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication];
MyController* myController = appDelegate.myController; //unrecognized selector sent to instance

成为Objective-C的新手,我确信我做的事情非常糟糕。这有什么不对?

1 个答案:

答案 0 :(得分:4)

使用以下内容替换实例化appDelegate的调用:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

现在您正在向UIApplication实例发送消息,而不是AppDelegate的实例。请注意,+[UIApplication sharedApplication]的返回类型为UIApplication *-[UIApplication delegate]的返回类型为id<UIApplicationDelegate>(在运行时,假设所有配置都正确,此委托对象将为AppDelegate个实例。

错误信息可能会在这里给你一个提示 - 它可能是这样的:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIApplication myController]: unrecognized selector sent to instance

原因部分中UIApplication的存在告诉您UIApplication类无法识别此选择器,而方括号前的-表示邮件已发送至UIApplication的一个实例。如果您已将无法识别的选择器发送到类对象,则-将替换为+(这是传达方法签名的常用表示法)。