• [Objective-C语言教程]类别(28)


    有时,可能会发现希望通过添加仅在某些情况下有用的行为来扩展现有类。 要向现有类添加此类扩展,Objective-C提供了类别和扩展。

    如果需要向现有类添加方法,或许为了添加功能以便在应用程序中更容易地执行某些操作,最简单的方法是使用类别。

    声明类别的语法使用@interface关键字,就像标准的Objective-C类描述一样,但不表示子类的任何继承。在括号中指定类别的名称,如下所示 -

    1 @interface ClassName (CategoryName)
    2 
    3 @end

    1. 类别的特征

    即使没有原始实现源代码,也可以为任何类声明类别。在类别中声明的任何方法都可用于原始类的所有实例,以及原始类的任何子类。
    在运行时,类别添加的方法与原始类实现的方法之间没有区别。

    现在,来看一个类别实现的示例。在Cocoa类NSString中添加一个类别。此类别将使可以添加一个新方法getCopyRightString,它返回版权字符串。 如下所示 -

     1 #import <Foundation/Foundation.h>
     2 
     3 @interface NSString(MyAdditions)
     4 +(NSString *)getCopyRightString;
     5 @end
     6 
     7 @implementation NSString(MyAdditions)
     8 
     9 +(NSString *)getCopyRightString {
    10    return @"Copyright y ii bai.com 2019";
    11 }
    12 
    13 @end
    14 
    15 int main(int argc, const char * argv[]) {
    16    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    17    NSString *copyrightString = [NSString getCopyRightString];
    18    NSLog(@"Accessing Category: %@",copyrightString);
    19 
    20    [pool drain];
    21    return 0;
    22 }

    执行上面示例代码,得到以下结果:

    2018-11-16 02:45:34.949 main[131207] Accessing Category: Copyright y ii bai.com 2019

    即使类别添加的任何方法都可用于类及其子类的所有实例,仍需要在任何源代码文件中导入类别头文件,否则将遇到编译器警告和错误。

    在上面示例中,由于只有一个类,因此没有包含任何头文件,在这种情况下应该包含如上所述的头文件。

  • 相关阅读:
    强类型、弱类型、静态、动态语言定义(转载)
    What is a non-trivial constructor in C++?(转载)
    面试准备之面试题(C++) (一)
    python实现tail(考虑到几种特殊情况)
    rsyslog应用案例
    FUCK, 排查python写入mysql数据库过慢的过程(心都碎了)
    svn相关操作
    springCloud学习中遇到的问题
    idea启动项目没错,可是debug却一直启动不起来
    前端控制台返回406错误解决方法
  • 原文地址:https://www.cnblogs.com/strengthen/p/10571893.html
Copyright © 2020-2023  润新知