未实现的委托方法导致崩溃

时间:2012-01-26 13:27:14

标签: ios objective-c delegates

我创建了一个协议并将其分配给委托对象

@protocol AppBrainDelegate <NSObject>
@optional
- (void)didLocateUser;
- (void)didFinishLoadingDataWithData:(NSDictionary *)fetchedData;
@end

@interface Brain : NSObject
@property (strong, nonatomic) id <AppBrainDelegate> delegate;

我认为协议声明中@optional的含义意味着,如果控制器不想要,则控制器不必监听委托方法。

如果没有在控制器中实现第一个委托方法,那么这是崩溃日志。如果我这样做,我不会崩溃。好像我不明白将委托方法声明为可选的概念。你能告诉我我的错误在哪里吗?

  

* 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [EventViewController didLocateUser]:无法识别的选择器发送到实例0x1fb300'

1 个答案:

答案 0 :(得分:36)

如果方法未在符合协议的类中实现,@optional只会抑制编译器警告。在调用委托方法之前,您仍需要检查委托是否实现它:

if ([delegate respondsToSelector:@selector(didLocateUser)]) {
    [delegate didLocateUser];
}

顺便说一句,您已使用strong语义创建了委托属性。除非您有充分的理由使用strong,否则代理人应为weak,因为您的Brain课程不拥有其代表(如果您考虑的话)对象图)。