ios - 未实现委托(delegate)方法导致崩溃

标签 ios objective-c delegates

我创建了一个协议(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/

相关文章:

ios - UISearchBarDisplayController 与 UINavigationBar 不能很好地配合

ios - 跟踪 iPhone 数据使用情况

iOS,JSON 检查值是否为 false 或字符串

ios - 自定义委托(delegate)很快就为零

iphone - iOS 应用程序在 appStore 上架后行为发生了变化

iphone - EXC_BREAKPOINT 崩溃。可能越狱问题?

ios - 是否可以自定义应用程序图标角标(Badge) : Xcode?

iphone - 为什么 Apple 使用 Objective-C?

C#委托(delegate)只写出最后一个方法

C# 成员方法作为静态方法 ("reversed extension method")