Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用委托协议初始化_Objective C_Delegates_Initialization_Protocols - Fatal编程技术网

Objective c 使用委托协议初始化

Objective c 使用委托协议初始化,objective-c,delegates,initialization,protocols,Objective C,Delegates,Initialization,Protocols,每当我创建一个具有符合协议的委托的init时,我将init写为: - (id)initWithDelegate:(id<ProtocolToConform>)delegate; delegate参数未指定是否符合UIAlertViewDelegate协议?苹果为什么会这样做,有什么线索吗?好问题!我做同样的事情是希望在编译时捕获更多的错误 苹果似乎符合他们自己的标准;如下列文件所述: 要为自定义类实现委托,请完成以下步骤: 在类头文件中声明委托访问器方法 实现访问器方法。在内存管理

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

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

delegate参数未指定是否符合
UIAlertViewDelegate
协议?苹果为什么会这样做,有什么线索吗?

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

苹果似乎符合他们自己的标准;如下列文件所述:

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

在类头文件中声明委托访问器方法

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


我的理解是,API在几年前是一个大烂摊子,他们仍然在解决所有这些问题

请注意,直到最近,许多协议都是非正式的,在API中几乎到处都可以找到代理,而代理只能作为
id
。苹果在每一个版本中都在逐步修复它,例如iOS 6.0附带的正式
NSURLConnection
Delegories。或者请注意,在iOS 6.1中,一些
id
返回类型被更改为
instancetype

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

@property(nonatomic,assign) id /*<UIAlertViewDelegate>*/ delegate
@属性(非原子,赋值)id/**/delegate

显然有人想在声明中添加协议,但只添加了注释。我猜他们没有使用协议来实现兼容性。

我认为他们只是懒得添加,或者可能是因为所有UIAlertViewDelegate方法都是可选的,委托是否符合协议并不重要。在这种情况下,这不会带来任何好处,要使协议与类一致,这将是一个额外的麻烦。尽管如果您选中UITableView.h,您可以看到
@property(nonatomic,assign)id delegate所以他们似乎把它弄混了:-)
- (id)delegate;
- (void)setDelegate:(id)newDelegate;
- (id)delegate {
    return delegate;
}
 
- (void)setDelegate:(id)newDelegate {
    delegate = newDelegate;
}
@property(nonatomic,assign) id /*<UIAlertViewDelegate>*/ delegate