Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 未实现委托方法会导致崩溃_Ios_Objective C_Delegates - Fatal编程技术网

Ios 未实现委托方法会导致崩溃

Ios 未实现委托方法会导致崩溃,ios,objective-c,delegates,Ios,Objective C,Delegates,我创建了一个协议并将其分配给一个委托对象 @protocol AppBrainDelegate <NSObject> @optional - (void)didLocateUser; - (void)didFinishLoadingDataWithData:(NSDictionary *)fetchedData; @end @interface Brain : NSObject @property (strong, nonatomic) id <AppBrainDelegat

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

@protocol AppBrainDelegate <NSObject>
@optional
- (void)didLocateUser;
- (void)didFinishLoadingDataWithData:(NSDictionary *)fetchedData;
@end

@interface Brain : NSObject
@property (strong, nonatomic) id <AppBrainDelegate> delegate;
@协议代理
@可选的
-(无效)didLocateUser;
-(void)使用数据完成加载数据:(NSDictionary*)获取数据;
@结束
@界面脑:NSObject
@属性(强,非原子)id委托;
我认为这个@optional在协议声明中的意思是,如果控制器不想监听委托方法,就不必监听委托方法

如果不在控制器中实现第一个委托方法,下面是崩溃日志。如果我这样做了,我就不会崩溃。似乎我不理解将委托方法声明为可选的概念。你能解释一下我的错误在哪里吗

*由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[EventViewController didLocateUser]:发送到实例0x1fb300的选择器无法识别”


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

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

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

谢谢!这就成功了!有着完全相同的问题。谢谢你的绝妙建议。我还认为@optional声明不仅仅是抑制编译器警告。