Objective

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




好了, 这次我们就讲到这里, 下次我们继续~~~

原文地址:https://www.cnblogs.com/iOSCain/p/4282837.html