每当我创建一个具有符合协议的委托的init时,我就按如下方式编写init:
- (id)initWithDelegate:(id<ProtocolToConform>)delegate;
这样,如果创建对象不符合协议,我将收到警告。
但是我注意到ie UIAlertView
init方法如下所示:
- (id)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ...
委托参数未指定符合UIAlertViewDelegate
协议?苹果公司为什么这样做的任何线索?
答案 0 :(得分:4)
好问题!为了在编译时捕获更多错误,我也做了同样的事情。
Apple似乎符合他们自己的标准;如Concepts in Objective-C中所述:要为自定义类实现委托,请完成以下步骤:
在类头文件中声明委托访问器方法。
- (id)delegate;
- (void)setDelegate:(id)newDelegate;
实施访问者方法。在内存管理程序中,为了避免保留周期,setter方法不应保留或复制您的委托。
- (id)delegate {
return delegate;
}
- (void)setDelegate:(id)newDelegate {
delegate = newDelegate;
}
答案 1 :(得分:2)
我的理解是,API在几年前是一个大混乱,他们仍在解决所有这些问题。
请注意,直到最近,许多协议都是非正式的,并且几乎在API中的任何地方,您都只能将代理视为id
。 Apple正在逐步修复每个版本,例如正式的NSURLConnection
代表带有iOS 6.0。或者请注意,在iOS 6.1中,某些id
返回类型已更改为instancetype
。
嗯,这是我最初的想法,在检查了头文件之后:
@property(nonatomic,assign) id /*<UIAlertViewDelegate>*/ delegate
很明显,有人想将协议添加到声明中,但只添加了注释。我猜他们没有兼容协议就离开了它。