美文网首页
《Objective-C基础教程》读书笔记9—类别

《Objective-C基础教程》读书笔记9—类别

作者: 天山雪莲_38324 | 来源:发表于2018-10-19 00:10 被阅读3次

    为已经存在的类添加行为时,通常采用创建子类的方法。但如果创建子类不方便,利用Objective-C的动态运行时分配机制,你可以为现有的类添加新方法。这些新方法在Objective-C里被称为类别。
    1.1 创建类别
    类别是一种为现有的类添加新方法的方式。你可以为任何类添加新的方法。通常情况下,类别文件的名称为“类名称+类别名称”。
    1.1.1 开始创建类别
    1.1.2 @interface部分
    只要保证类别名称唯一,你可以向一个类中添加任意数量的类别。你可以指定想要添加类别的类和类别的名称,还可以列出你要添加的方法,最后以@end语句结束。你可以在类别中添加属性,但是不能添加实例变量,而且属性必须是@dynamic类型的。添加属性的好处在于你可以通过点表达式来访问setter和getter方法。
    1.1.3 @implementation部分
    任何NSString对象都能够响应你为NSString类添加的类别方法的消息,包括字面量字符串、description方法返回的字符串、可变字符串、其他工具集某部分字符串、文件中加载的字符串、从因特网海量内容中提取的字符串,等等。正式这种兼容性使类别成为了一种非常强大的概念。通过它不需要创建NSString类的子类就可以获得一种新的行为。
    1.1.4 类别的缺陷
    类别有两个局限性:第一是无法向类中添加新的实例变量。类别没有空间容纳实例变量。第二个就是名称冲突,也就是类别中的方法与现有的方法重名。当发生名称冲突时,类别具有更高的优先级。你的类别方法将完全取代初始方法,导致初始方法不再可用。最好在自己的类别方法中添加一个前缀,以确保不会发生名称冲突。
    1.1.5 类别的优势
    在Cocoa中,类别主要有三个用途: 将类的实现代码分散到多个不同文件或框架中,创建对私有方法的前向引用,以及向对象添加非正式协议。
    1.1.6 类扩展
    类扩展,或者可以称之为延展,class extension。这样称呼的原因: 可以通过添加私有属性和方法来扩展它。
    类扩展的特点如下:
    ① 它不需要名字。
    ② 你可以在包含你的源代码的类(也就是你自己的类)中使用它。
    ③ 你可以添加实例变量。
    ④ 你可以将只读权限改成可读写的权限。
    ⑤ 创建数量不限。
    面向对象编程的一个特征就是信息隐藏。你只会把用户需要看到的展示出来,其他的则不需要,比如内部实现的细节。
    1.2 利用类别分散实现代码
    类别可以访问其继承的类的实例变量。类别的方法具有更高的优先级。
    利用类别,不仅可以将一个类的实现分散到多个不同的源文件中,还可以分散到多个不同的框架中。这点可以参考Apple官方文档。
    1.3 通过类别创建前向引用
    如果能够先定义一个方法然后再使用它,编译器将会找到你的方法定义,因而不会产生警告。但是,如果不方便这么做,或者你使用的是另一个类中尚未发布的方法,那么就需要采取其他措施。
    常用措施:通常类别来救急,在类别中申明某一个方法即可,并将其置于实现文件的最前面。
    不能访问类里面的私有变量和方法。
    1.4 非正式协议和委托类别
    委托(delegate)技术:委托是一种对象,由另一个类请求执行某些工作。最常见的情况是,编写委托对象并且将其提供给其他一些对象,通常是Cocoa框架中的对象,通过实现特定的方法,你可以控制Cocoa中对象的行为。
    1.4.1 ITunesFinder项目
    互联网编号分配机构维护着一个互联网协议族列表,该列表通常被映射为Bonjour服务。
    runloop循环是一种Cocoa概念。它在等待某些事情发生之前一直处于阻塞状态,即不执行任何代码。runloop用于监听网络流量,等待用户事件以及其他很多操作。
    1.4.2 委托和类别
    委托强调类别的另一种应用: 被发送给委托对象的方法可以声明为一个NSObject的类别。通过这种方式创建NSObject的类别,任何类的对象都可以作为委托对象使用。既不需要从特定的类中继承(如在C++中那样),也不需要符合某个特定的接口(如在Java中那样)。
    创建一个NSObject的类别称为“创建一个非正式协议”。计算机术语中的“协议”是一组管理通信的规则。非正式协议只是一种表达式,它表示“这里有一些你可能希望实现的方法”,你可以使用它们更好地完成工作。
    1.4.3 响应选择器
    选择器(selector), 选择器只是一个方法名称,但它以Objective-C运行时使用的特殊方式编码,以快速执行查询。你可以使用@selector()编译指令圆括号中的方法名称来指定选择器。例如:@selector(setEngine:)。
    NSObject提供了一个名称为respondToSelector:的方法,该方法询问对象以确定其是否能够响应某个特定的消息。
    为了确定委托对象能否响应消息,被委托对象首先调用repondsToSelector方法。如果该委托对象能够响应特定的消息,则被委托对象向该对象发送消息。否则,被委托对象忽略委托对象。
    1.4.4 选择器的其他应用
    选择器可以传递,可以作为方法的参数使用,甚至可以作为实例变量存储。这样可以生成一些非常强大和灵活的构造。
    小结:非正式协议是NSObject的一个类别,它列出了对象可以响应的方法。非正式协议用于实现委托,委托是一种允许你轻松定制对象行为的技术。通过选择器可以在代码中指定特定的Objective-C消息。

    相关文章

      网友评论

          本文标题:《Objective-C基础教程》读书笔记9—类别

          本文链接:https://www.haomeiwen.com/subject/eiyezftx.html