2012-01-26 53 views
12

我创建了一个协议,并将其分配给没有实现的委托方法导致崩溃

@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'

回答

35

@optional简单地抑制编译器警告,如果方法没有在符合协议的类中实现。调用委托方法之前,你还需要检查委托实现了它:

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

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

+0

谢谢!这做了蜱! – MrBr

+1

有这个完全相同的问题。谢谢你的提示。我也觉得@optional声明不仅仅是压制编译器警告。 – Tander