• 关于OC中的委托delegate


    使用委托:

    可以看成是一个类中声明了一个protocol,另外一个类作为委托来实现这个protocol内的方法。

    比如当在iPhone中创建一个表时,需要使用UITableView类。但是这个类不知道表的标题,也不知道有多少的部分或行需要显示,也不知道表中每行或每个单元格中应该显示什么内容。所以它将这一系列的工作委托给你,利用定义的一个协议:UITableViewDateSource。当他需要显示信息时,就调用适当的协议方法。

    UITableView类中还定义了一个UITableViewDelegate协议,这个协议内的方法指示诸如当选中一行时应该出现的动作,它将这个动作的决定权委托给用户。

    1、Informal Protocols:非正式协议

    它实际上是一个具名类扩展(Category),只声明了一个方法列表,但没有实现这些方法,故也称为通用扩展(Informal Category),有时它还被称为抽象协议(abstract protocols,和CPP中抽象类作接口类似)。

    任何人都要继承相同的根类,比如NSObject等。故一般在根类中定义通用扩展(Informal Category).

    • 来看如下代码,NSObject类中的NSComparisonMethods扩展:
    1 @interface NSObject (NSComparisonMethods)
    2 - (BOOL) isEqualTo: (id) object;
    3 - (BOOL) isLessThanOrEqualTo: (id) object;
    4 ...
    5 @end

    (以下将formal protocol译为专用协议,将informal protocol译为通用协议,以示区分)

    一个通用协议(通用扩展)仅仅是一个扩展名下面包含的一些列方法名称,这样对于方法的归档和模块化而言是有利的。

    声明通用协议的类并不实现它里面的方法,而这个类的子类若想实现通用协议中的方法,则必须重新再在这个子类的接口中进行方法声明。

    与专用协议(普通的protocol)不同,编译器并不能对通用协议排错,如对协议的接受性检查或进行协议测试等。

    若有类对象接受某专用协议,它必须接受这个协议的所有required消息,无论是在编译还是运行时,消息可用性都能得到保证。

    但如果一个对象接受某通用协议,这个对象并不需要接受协议中的所有消息,而是以协议本身来定。消息可用性在运行时才得到执行,但在编译时并不能被保证。

    (在OC2.0中@optional指令是为了取代informal protocol而加入的,在UIKit类中已经有一些应用。)

    2、Composite Objects:组合对象

    一个类的对象可以由其他类对象组成,这也是一种扩展类的手段(除了继承和类扩展以外)。

  • 相关阅读:
    Swift 协议
    Objective C 链式调用
    objective-c 关键字和概念
    如何在Objective-C中实现链式语法?
    _视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途
    Swift静态方法
    Swift静态属性
    objective-c 中代码块(blocks)
    OS笔记047代理传值和block传值
    Objective-C官方文档翻译 Block
  • 原文地址:https://www.cnblogs.com/songlei0601/p/5744973.html
Copyright © 2020-2023  润新知