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

我创建了一个协议并将其分配给一个委托对象
@protocol AppBrainDelegate <NSObject>
@optional
- (void)didLocateUser;
- (void)didFinishLoadingDataWithData:(NSDictionary *)fetchedData;
@end

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

我认为这个@optional在协议声明中的含义意味着控制器不必听代理方法,如果他们不想.

如果不在控制器中实现第一个委托方法,那么这是崩溃日志.如果我这样做,我不会崩溃.似乎我不明白将委托方法声明为可选的概念.你可以向我解释我的错误在哪里吗?

* Terminating app due to uncaught exception ‘NSinvalidargumentexception’,reason: ‘-[EventViewController didLocateUser]: unrecognized selector sent to instance 0x1fb300’

解决方法

如果方法未在符合协议的类中实现,那么@optional只会抑制编译器警告.在调用委托方法之前,您仍然需要检查委托实现它:
if ([delegate respondsToSelector:@selector(didLocateUser)]) {
    [delegate didLocateUser];
}

顺便提一句,你已经使用强大的语义创建了你的委托属性.除非你有一个特别好的理由使用强大的,代表应该是软弱的,因为你的Brain类不拥有它的代理(如果你考虑对象图).

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...