在我们开发中, 如果要给一个类扩充一些方法, 那么我们应该会选择使用继承, 但问题来了, 如果是使用继承, 那么我们就又要创建对象, 写更多的代码, 更加的麻烦了, 而类别(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中可以查看)
好了, 这次我们就讲到这里, 下次我们继续~~~