黑马程序员——Objective-C——Category、SEL

———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———


一、分类(Category)

1>作用:在不改变原来类的前提下,给类扩充一些方法

2>格式:

@interface 类名 (分类名称)
// 方法的声明
@end
@implementation 类名(分类名称)
// 方法的实现
@end

3>使用注意

a. 只能添加方法,不能添加成员变量,但是可以访问原类的成员变量

b. 如果重写原始类的方法实现,但是这样做会导致原始类的方法失效

c. 如果多个分类中实现了同一个方法,那么调用时会调用最后一个参与编译的分类中的方法

4>实例代码

// 只写了主要代码,原类代码并没有
#import “Person.h”  // 注意:这里要引入原类的头文件
@interface Person (studyPerson)
- (void)study
@end
@implementation Person (studyPerson)
- (void)study
{
	NSLog(@“%d的人好好学习!”,_age);  // 假设_age是元类的成员变量
}
@end

// main.m中
#import “Person.h”
#import “person+studyPerson.h”  // 注意:原类和分类的头文件都要导入
int main()
{
	Person *person = [[Person alloc] init];
	[person study];   // 调用分类的方法
	return 0;
}

二、SEL

1>总结:

a. 每个类的方法列表都存储在类对象中

b. 每个方法都有一个与之对应的SEL类型的数据

c. 根据一个SEL数据就可以找到方法的地址,进而调用方法

d. 每个方法的内部都有一个_cmd,代表着当前方法。

e. 对象方法中不可以这样写:[selfperformSelector:_cmd]; // 会引发死循环

 

2>方法的寻找过程:

a. 首先把方法名包装成SEL类型的数据;

b. 根据SEL数据找到对应的方法地址;

c. 根据方法地址调用相应的方法。

SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去寻找对应的方法地址,找到方法地址后就可以调用方法。这些都是运行时特性,发消息就是发送SEL,然后根据SEL找到地址,调用方法。

3>代码

// 把方法转换成SEL数据
SEL s = @selector (test); 

// 把字符串转换成SEL数据
SEL s = NSSelectorFromString(@”test”); 

// 将SEL数据转换为NSString对象
NSString *str = NSStringFromSelector(@selector(test));

// 使用SEL数据调用test方法
[person performSelector:@selector(test)];



你可能感兴趣的:(Objective-C)