Objective - C基础: 第四天 - 4.类别的基本认识之一
在我们开发中, 如果要给一个类扩充一些方法, 那么我们应该会选择使用继承, 但问题来了, 如果是使用继承, 那么我们就又要创建对象, 写更多的代码, 更加的麻烦了, 而类别(Category)就可以为我们解决这一类的问题.
下面让我们来一起来看看例子:
#import <Foundation/Foundaiton.h> @interface Person : NSObject - (void)test; @end @implementation Person - (void)test { NSLog(@"调用了test方法"); } @end
上面就是我们平常所定义的一些方法, 如果我们需要在这基础上添加一些方法, 但不能去修改原来类的代码, 那么就可以使用类别来添加:
类别的命名规范:
类名+(分类名称)
分类名称可以是人名也可以是其他, 按照个人喜好, 下面就是使用类别的例子:
@interface Person (XMN) @end @implementation Person (XMN) @end
在.h文件中, 我们是会看到#import "Person.h", 在.m文件了会看到#import "Person+XMN", 在.h文件中的引用头文件是告诉编译器, 我们是给什么类名添加类别, 而在.m文件的引用头文件, 是告诉编译器, 我们这个类别名是什么.
完整的例子:
#import <Foundation/Foundaiton.h> @interface Person : NSObject - (void)test; @end @implementation Person - (void)test { NSLog(@"调用了test方法"); } @end @interface Person (XMN) - (void)cry; @end @implementation Person (XMN) - (void)cry { NSLog(@"大声的哭"); } @end int main() { Person *p = [[Person alloc]init]; [p test]; [p cry]; return 0; }
下面是在Xcode上的类别声明和实现:
如果要加多个类别, 那就继续添加, 这个不会影响原来的类, 反正会提高我们的团队合作.
注意:
1. 分类只能添加方法, 不能添加成员变量, 否则会报错.
2. 分类方法实现中是可以访问我们原来类的成员变量.
3. 当分类中的方法名与原来类的方法名相同, 那么就会执行分类中的方法, 而不会执行原来类的方法, 坏处是会覆盖原来类的方法, 会导致原来类的方法失效, 所以不建议写方法名重复.
4. 方法调用的优先级: 分类 ---> 原来类 --->父类
5. 如果在项目中有两个类别, 它们都有相同名字的方法, 最后显示出来的结果是最后参与编译的类别方法, 这个是由编译文件顺序所决定的. (在项目的Build Phases中可以查看)
好了, 这次我们就讲到这里, 下次我们继续~~~