我创建了一个协议(protocol)并将其分配给一个委托(delegate)对象
@protocol AppBrainDelegate <NSObject>
@optional
- (void)didLocateUser;
- (void)didFinishLoadingDataWithData:(NSDictionary *)fetchedData;
@end
@interface Brain : NSObject
@property (strong, nonatomic) id <AppBrainDelegate> delegate;
我认为协议(protocol)声明中这个@optional 的含义意味着,如果 Controller 不想听,则不必听委托(delegate)方法。
如果没有在 Controller 中实现第一个委托(delegate)方法,这里是崩溃日志。如果我这样做,我不会崩溃。好像我不理解将委托(delegate)方法声明为可选的概念。你能告诉我我的错误在哪里吗?
* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[EventViewController didLocateUser]: unrecognized selector sent to instance 0x1fb300'
最佳答案
@optional
如果该方法未在符合协议(protocol)的类中实现,则简单地抑制编译器警告。在调用委托(delegate)方法之前,您仍然需要检查委托(delegate)是否实现了它:
if ([delegate respondsToSelector:@selector(didLocateUser)]) {
[delegate didLocateUser];
}
顺便说一句,您已经使用 strong
创建了委托(delegate)属性语义。除非你有特别好的理由使用 strong
, 委托(delegate)应该是 weak
, 因为你的 Brain
类不拥有它的委托(delegate)(如果你考虑对象图的话)。
关于ios - 未实现委托(delegate)方法导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9018764/