------<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的使用场景
在使用基础类库中的类时,有可能希望这些类实现一些自己需要的方法,比如写个NSString+JSON.h,为NSString这个类拓展一些解析JSON的方法