init与委托协议

时间:2013-01-31 13:13:19

标签: objective-c delegates initialization protocols

每当我创建一个具有符合协议的委托的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协议?苹果公司为什么这样做的任何线索?

2 个答案:

答案 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

很明显,有人想将协议添加到声明中,但只添加了注释。我猜他们没有兼容协议就离开了它。