黑马程序员(OC特有语法@class和category)

时间:2023-02-18 20:57:11

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

   @class

   通常引用一个类有两种办法:一种是通过#import方式引入;一种是通过@class引入

   两种方式的区别:

1、#import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,在编译的时候,告诉编译器,这是一个类名,无需报错。

2、在头文件中,一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。

3、在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。

4、如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,产生死循环的问题。如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。

综上所述.@class一般出现在头文件中.#import一般出现在实现,也就是.m中.

 

分类—Category

OC提供了一种与众不同的方式--Catagory,可以动态的为已经存在的类添加新的行为(方法)这样可以保证类的原始设计规模较小,功能增加时再逐步扩展。使用Category对类进行扩展时,不需要创建子类。Category使用简单的方式,实现了类的相关方法的模块化,把不同的类方法分配到不同的分类文件中。

如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式:

继承

分类-Category    

 1、  分类的声明

@interface类名 (分类名称)

// 方法声明

@end

2、   分类的实现

@implementation 类名 (分类名称)

// 方法实现

@end

 

 好处

一个庞大的类可以分模块开发

一个庞大的类可以由多个人来编写,更有利于团队合作

    

     注意

① Category可以访问原始类的实例变量,但不能添加变量,只能添加方法。如果想添加变量,可以考虑通过继承创建子类

② Category可以实现原始类的方法,但不推荐这么做,因为它是直接替换掉原来的方法,这么做的后果是再也不能访问原来的方法

③多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效

 

Category的使用场景

1、在定义类时的某些情况下(例如需求变更)你可能想要为其中的某个或几个类中添加新的方法
2、一个类中包含了许多不同种类的方法需要实现,而这些方法需要不同团队的成员实现

在使用基础类库中的类时可能希望这些类实现一些自己需要的方法,比如写个NSString+JSON.h,为NSString这个类拓展一些解析JSON的方法