2013-01-31 92 views
10

每当我创建一个具有委托符合协议的初始化我写的初始化,因为这:初始化与委托协议

- (id)initWithDelegate:(id<ProtocolToConform>)delegate; 

这样,我将有一个警告,如果创建的对象不符合协议。

但是我注意到,即UIAlertView init方法是这样的:

- (id)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ... 

委托参数没有指定符合UIAlertViewDelegate协议?任何线索为什么苹果这样做?

+0

我以为他们只是懒得补充一点,还有可能是因为所有的UIAlertViewDelegate方法是可选的,它不一样,如果委托符合协议或没有关系。 – howanghk

+0

在这种情况下它不会带来任何好处,将协议与您的课程相一致将会带来额外的痛苦。 – holex

回答

1

我的理解是,API弄得一塌糊涂,几年前,他们还在修复所有这些问题。

注意,直到最近,许多协议是非正式和API中几乎无处不在,你可以找到代表仅作为id。苹果正在每个版本中逐步修复它,例如正式的NSURLConnection代表随附iOS 6.0。或者请注意,在iOS 6.1中,某些id返回类型已更改为instancetype

好了,这是我最初的想法,检查头文件后:

@property(nonatomic,assign) id /*<UIAlertViewDelegate>*/ delegate

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

4

好问题!我也在做同样的事情,希望在编译时捕获更多的错误。

苹果似乎符合自己的标准;在Concepts in Objective-C说:

要实现委托你的自定义类,请完成以下步骤:

中声明你的类的头文件委托存取方法。

- (id)delegate; 
- (void)setDelegate:(id)newDelegate; 

实现存取方法。在内存管理程序中,为避免保留周期,setter方法不应保留或复制委托。

- (id)delegate { 
    return delegate; 
} 

- (void)setDelegate:(id)newDelegate { 
    delegate = newDelegate; 
} 
+0

虽然如果你检查UITableView.h,你可以看到'@property(nonatomic,assign)id delegate;'所以它们似乎混淆了:-) –