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

来源:互联网 发布:手机兼职淘宝客服 编辑:程序博客网 时间:2024/06/08 16:59

———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)];



0 0
原创粉丝点击