未实现委托方法导致崩溃

Posted

技术标签:

【中文标题】未实现委托方法导致崩溃【英文标题】:not implemented delegate method leads to crash 【发布时间】:2012-01-26 13:27:14 【问题描述】:

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

@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】:

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

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

顺便说一句,您已经使用strong 语义创建了您的委托属性。除非您有特别好的理由使用 strong,否则委托应该是 weak,因为您的 Brain 类不拥有它的委托(如果您考虑对象图)。

【讨论】:

谢谢!这成功了! 遇到了同样的问题。感谢您的精彩提示。我还认为@optional 声明不仅仅是抑制编译器警告。

以上是关于未实现委托方法导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

实现我自己的委托时未调用 UIAlertViewDelegate 方法 clickedButtonAtIndex

未调用 SWTableViewCell 委托方法

UITextView 委托未获得所有方法调用

iOS:当应用程序因任何崩溃而退出时,是不是有任何委托方法

未调用 UICollectionView 内部 UITableView 的委托方法

隐藏时未调用委托方法