对Objective-c视图、代表和出口的混淆

对Objective-c视图、代表和出口的混淆,objective-c,cocoa,design-patterns,cocoa-design-patterns,Objective C,Cocoa,Design Patterns,Cocoa Design Patterns,我试图自学objective-c,但来自Python/Java的背景,这是非常困难的。我试着发表一大堆我感到困惑的观点,但它被标记为太模糊了,所以我将把它分成几个部分 首先,我发现的每个代理和出口的示例都使用cocoa视图代码来传达想法。不幸的是,我还没有理解足够的代码来理解示例的要点。那么,有人能提供一个更基本的委托示例吗?我的理解是,这是一种子类化的方式;这比传统的子类化更好吗?为什么每个cocoa项目都自动包含appDelegate.m?委托是否可以用于其他目的,而不仅仅是GUI内容 好的

我试图自学objective-c,但来自Python/Java的背景,这是非常困难的。我试着发表一大堆我感到困惑的观点,但它被标记为太模糊了,所以我将把它分成几个部分

首先,我发现的每个代理和出口的示例都使用cocoa视图代码来传达想法。不幸的是,我还没有理解足够的代码来理解示例的要点。那么,有人能提供一个更基本的委托示例吗?我的理解是,这是一种子类化的方式;这比传统的子类化更好吗?为什么每个cocoa项目都自动包含appDelegate.m?委托是否可以用于其他目的,而不仅仅是GUI内容

好的,我想我明白了。因此,委托是一个符合其他类协议的类。协议只是必须(或者如果设置为可选)在委托类中实现的方法和变量的列表。要进行委托,必须先使用@interface关键字,然后是委托人的姓名,然后(在<>符号中)协议名?所以,如果类c1想要将自己设置为类c的委托,那么类c必须首先指定一个协议,对吗?然后您就可以在c1中实现c协议中的所有内容: @接口c1; 我觉得我遗漏了一些细节,但希望我的概念是正确的。:)这也解释了神秘的小于和大于符号;它们声明委托实现的接口。

插座同样始终与视图代码相关联。它们似乎是某种对象间消息传递系统。是这样吗?同样,一个不与复杂GUI语句混合的基本出口示例将非常好。 所以永远不需要插座?我知道除了与Interface Builder一起使用外,不需要IBOutlet和IBAction,但我认为Outlet比这更通用?这些文档似乎表明它们甚至不是专门用于接口的,但可以用于任何用途


提前感谢您的帮助。

没有委托不是子类化的方式。我也来自Java,现在已经做O-C将近5年了

委托通常遵守协议,协议相当于接口。这一点的好处在于,它为您提供了很大的灵活性,让您能够实现学员所涵盖的内容。例如,您将看到可以通过扩展UITableViewController或实现委托来实现表视图。这样,如果您有一个组合视图,其中用户正在从一个表中选择项并将它们放入另一个表中,那么您可以使用单个控制器并让它对两个视图执行委派

考虑委托的最佳方式是作为面向消息/事件的回调的示例。你有没有听过这样一句话,让框架不同于普通编程的是,有了框架,它告诉你它希望你做什么来确保你所寻求的结果?这就是代表团。昨晚我正在做一个集合视图,无法打开编辑菜单。只需提供三个方法的委托,不知道菜单是如何调用的,长按手势处理程序在哪里,等等


请注意,委托是使O-C世界中不需要依赖项注入的粘合剂。我更喜欢它们。

委托是常见的设计模式(http://en.wikipedia.org/wiki/Delegation_pattern),它们不具有客观性c特异性


插座可能会绑定控制器和视图(GUI)。您可能知道MVC范例(模型-视图-控制器)吗?因此,您可以使用Interface Builder构建GUI(来自MVC的视图),并使用Outlet将此GUI的元素(如按钮、文本字段等)绑定到Obj-C代码(来自MVC的控制器)上。

更新:代理不必遵守协议。协议只是使要求某些类具有方法变得更容易。它允许您知道作为委托设置的某个对象实现了某个方法,这样您就可以安全地调用它,并允许编译器验证该方法是否确实实现了(如果将委托实例变量声明为
id delegate
,则如果试图将
delegate
设置为不符合
SomeProtocol
的类的对象,编译器将发出警告或错误。)

协议有助于确保安全,但它们不是严格必需的。一个类可以有一个委托(或多个!),并且它们根本不必遵守任何协议

至于outlet,不,它们是专门用于Interface Builder的。
IBOutlet
IBAction
关键字对代码没有影响(甚至在编译之前就被去掉了)-它们是Interface Builder要查找的唯一标记,以便它知道哪些属性和方法应该在接口中可访问。术语“outlet”是对标记为
IBOutlet
的内容的直接引用,并且在我所知道的任何其他上下文中都没有使用

再一次,如果你不马上理解这一点,没关系。仔细想想,在某个时候,它只会“咔嗒”一声。我很长一段时间都在关注代理,就像这样,直到有一天,我才意识到代理真的没有什么特别之处。它们是被其他对象引用的常规对象-只是这个设计模式有一个特殊的名称(委托),这些对象只被称为委托。它们可以很容易地被称为
陀螺仪
法拉费尔斯
,其净效果是相同的。:P
您不需要为对象命名为委托,它只是一种约定


关于代表:首先要了解的是,“代表”一词并没有什么特别之处,“代表”一词只是一个代表的标题,直到我有了适当的“啊哈!”时刻,我才明白这一点
@protocol SpriteDelegateProtocol
    @required
    - (void) projectionMatrix;
    @optional
    - (void) animation:(int)animationIndex willCompleteFrameNumber:(int)frame forSprite:(id)sender;
@end

@interface Sprite
@property (nonatomic, assign) id<SpriteDelegateProtocol> delegate;
@end