protocoldelegate有什么区别?

我们怎么能在protocol class中申报variables

推荐答案

用(Objective-C中的@protocol语法)声明的协议用于声明类"采用"(声明它将使用此协议)将实现的一组方法.这意味着您可以在代码中指定,"只要它实现了特定的协议,您就不在乎使用哪个类".这可以在Objective-C中实现,如下所示:

id<MyProtocol> instanceOfClassThatImplementsMyProtocol;

如果您在代码中声明了这一点,那么任何"符合"协议MyProtocol的类都可以在变量instanceOfClassThatImplementsMyProtocol中使用.这意味着使用这个变量的代码知道,它可以使用MyProtocol中定义的任何方法来处理这个特定变量,而不管它是什么类.这是避免继承设计模式的好方法,并且避免了紧密耦合.

代表使用协议的语言功能.delegation design pattern是一种设计代码以在必要时使用协议的方法.在Cocoa框架中,委托设计模式用于指定符合特定协议的类的实例.这个特定的协议指定了委托类应该实现的方法,以便在给定的事件中执行特定的操作.使用委托的类知道其委托与协议共同形成,因此它知道可以在给定时间调用实现的方法.这种设计模式是解耦类的一种很好的方式,因为它使从一个委托实例交换到另一个委托实例变得非常容易——程序员所要做的就是确保替换实例或类符合必要的协议(即,它实现协议中指定的方法)!

协议和委托不仅限于Objective-C和Mac/iOS开发,Objective-C语言和Apple框架也大量使用了这种令人敬畏的语言功能和设计模式.

Edit:

这里有一个例子.在Cocoa Touch的UIKit框架中,有一个UITextFieldDelegate协议.该协议定义了一系列方法,作为UITextField实例的代理的类应该实现这些方法.换句话说,如果要将委托分配给UITextField(使用delegate属性),最好确保该类符合UITextFieldDelegate.实际上,因为UITextField的委托属性定义为:

@property(nonatomic, weak) id<UITextFieldDelegate> delegate

然后,如果您为编译器分配了一个不实现该协议的类,编译器将发出警告.这真的很有用.你必须声明一个类实现了一个协议,如果说它实现了,你就是在让其他类知道它们可以以特定的方式与你的类交互.因此,如果您将MyTextFieldDelegateClass的一个实例分配给UITextFielddelegate属性,UITextField knows可以调用MyTextFieldDelegateClass的一些特定方法(与文本输入、 Select 等相关).它之所以知道这一点,是因为MyTextFieldDelegateClass表示将实施UITextFieldDelegate协议.

最终,这一切都会在项目代码中带来更大的灵活性和适应性,我相信在使用这项技术后,您很快就会意识到这一点!:)

Objective-c相关问答推荐

如何删除Objective-C中未定义的符号&错误?

Objective-C NSMutableArray 在枚举时发生了变异?

通过指针算术访问数组值与 C 中的下标

如何使用 NSString drawInRect 使文本居中?

碰撞技术如何运作?

右对齐的 UITextField 空格键在 iOS 7 中不前进光标

指向方法返回类型的Expected a type错误

如何保存我的 iPhone 应用程序的用户首选项?

iOS 5:对 UIAppearance 感到好奇

如何推送两个视图控制器但只为第二个设置动画过渡?

显示启动画面的时间超过默认秒数

UITextField:键盘出现 timeshift 动视图

iOS是静态框架还是动态框架?

在我滚动之前,数据不会加载到 UITableView 中

使用 CocoaPods 时如何向 Xcode 添加自定义项目配置?

`[super viewDidLoad]` 约定

所有异常断点在模拟器上无缘无故停止

如何判断 WkWebView 是否在 Objective-C 中完成加载?

如何在 NSUserDefaults 中保存 NSMutablearray

无法在 iOS7 上将 UITextField 添加到 UIAlertView ...在 iOS 6 中有效