我创建了一个协议并将其分配给一个委托对象
@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类不拥有它的代理(如果你考虑对象图).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。