Objective c 使用Objective C中的协议在不同对象之间传输数据?

Objective c 使用Objective C中的协议在不同对象之间传输数据?,objective-c,cocoa-touch,ios4,protocols,Objective C,Cocoa Touch,Ios4,Protocols,嘿,伙计们,我现在有一个根表视图,底部有一个工具栏,里面有标签和一个刷新按钮,很像邮件应用程序的工具栏。此根表视图控制器通过分配和初始化DataUpdater类从服务器获取数据。此类中包含与服务器通信时调用的NSURLConnection委托方法 正如您可能猜到的,我需要知道在DataUpdater类中何时调用某些(委托)函数,以及传递给这些委托函数的参数值,以便我可以相应地更新工具栏上的标签(即连接…、更新等) 我遇到的问题是确定如何通知根表视图控制器这些委托方法中发生了什么。我会使用协议吗?

嘿,伙计们,我现在有一个根表视图,底部有一个工具栏,里面有标签和一个刷新按钮,很像邮件应用程序的工具栏。此根表视图控制器通过分配和初始化DataUpdater类从服务器获取数据。此类中包含与服务器通信时调用的NSURLConnection委托方法

正如您可能猜到的,我需要知道在DataUpdater类中何时调用某些(委托)函数,以及传递给这些委托函数的参数值,以便我可以相应地更新工具栏上的标签(即连接…、更新等)

我遇到的问题是确定如何通知根表视图控制器这些委托方法中发生了什么。我会使用协议吗?如果会,如何使用?我一直在浏览文档,不太明白如何获得这种效果。或者你会建议我用另一种方式实施我的计划吗


提前谢谢

协议是一种合同,上面写着:我承诺提供协议中定义的非可选方法,甚至是可选方法。它的用途类似于Java接口:解决缺少多个继承的问题

Objective-C中的委托模式通常是这样工作的:定义一个协议,然后在类中定义一个变量,如
id myDelegate
并定义setter和getter(通过常规方法,例如
-(void)setDelegate:(id)aDelegate;
或通过属性)

请注意,委托不会被保留!因此,如果使用属性,则需要
assign
选项,而不是
retain

现在回到类中,检查
myDelegate
是否为nil,如果不是,可以直接调用其非可选方法。如果要调用可选方法,首先需要通过
respondsToSelector:
验证其存在性

因此,如果决定使用委托模式,则需要定义一个协议,将该协议添加到根表视图控制器,在那里实现必要的方法,并确保调用
[foo setDelegate:self];
或类似的命令,通知其他类根表视图控制器是委托。当然,还要在类中实现委托调用

编辑:


另一种选择可能是使用
NSNotification
s,顺便说一句。通知的优点是可以让多个对象侦听并对其作出反应。缺点是不能(直接)进行传回值。例如,您可以定义一个委托方法,询问委托人是否要做某事。这在通知中是不可能的,它更像是在房间里大喊大叫,而不是进行一对一的对话。

协议是一种契约,它说:我承诺提供t中定义的非可选方法它的目的就像Java接口:解决缺少多个继承的问题

Objective-C中的委托模式通常是这样工作的:您定义一个协议,然后在类中定义一个变量,如
id myDelegate;
,并定义一个setter和可能的getter(通过常规方法,例如
-(void)setDelegate:(id)aDelegate;
或通过属性)

请注意,委托不会被保留!因此,如果使用属性,则需要
assign
选项,而不是
retain

现在回到类中,检查
myDelegate
是否为nil,如果不是,可以直接调用其非可选方法。如果要调用可选方法,首先需要通过
respondsToSelector:
验证其存在性

因此,如果决定使用委托模式,则需要定义一个协议,将该协议添加到根表视图控制器,在那里实现必要的方法,并确保调用
[foo setDelegate:self];
或类似的命令,通知其他类根表视图控制器是委托。当然,还要在类中实现委托调用

编辑:


另一种选择可能是使用
NSNotification
s,顺便说一句。通知的优点是可以让多个对象侦听并对其作出反应。缺点是不能(直接)进行传回值。例如,您可以定义一个委托方法,询问委托人是否要做某事。这在通知中是不可能的,它更像是在房间里大喊大叫,而不是进行一对一的对话。

DarkDust关于协议的回答很好,但我想补充一些内容

当涉及委派时,一个经常被忘记的基本问题是对象所有权。当程序运行时,它会创建一个对象树。它的根对象是应用程序委派,例如,它拥有一个导航控制器,它拥有各个视图控制器,它拥有视图,视图拥有它的视图等

通常会出现这样的问题:“为什么代理没有保留,只是被分配了?”问题是,如果您向解除分配的对象发送消息,程序将崩溃。那么如何确保代理保留?答案是对象所有权

我举一个例子:UITableView及其数据源是TableViewController,它只是一个委托。TableViewController持有对UITableView的view属性的引用,因此它拥有TableView。这意味着当TableView处于活动状态时,还必须存在其父对象,即UITableView的委托。因此,委托人不会以某种方式离开

最后,它还是关于内存管理的

带回家的信息是:先想一想