init与委托协议

Pet*_*rbo 10 delegates protocols initialization objective-c

每当我创建一个具有符合协议的委托的init时,我都会将init写为:

- (id)initWithDelegate:(id<ProtocolToConform>)delegate;
Run Code Online (Sandbox Code Playgroud)

这样,如果创建对象不符合协议,我将发出警告.

但是我注意到,即UIAlertViewinit方法如下所示:

- (id)initWithTitle:(NSString *)title message:(NSString *)message delegate:(id)delegate cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles, ...
Run Code Online (Sandbox Code Playgroud)

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

Sul*_*han 2

我的理解是,几年前 API 还是一团糟,他们仍在修复所有这些问题。

请注意,直到最近,许多协议都是非正式的,并且在 API 中几乎所有地方都只能以id. 苹果在每个版本中都在逐步修复这个问题,例如NSURLConnectioniOS 6.0 中就出现了正式代表。或者请注意,在 iOS 6.1 中,某些id返回类型已更改为instancetype.

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

@property(nonatomic,assign) id /*<UIAlertViewDelegate>*/ delegate
Run Code Online (Sandbox Code Playgroud)

显然有人想将协议添加到声明中,但只添加了注释。我猜他们为了兼容性而没有协议。