OC类的本质

来源:互联网 发布:mac字典扩充下载 编辑:程序博客网 时间:2024/06/05 08:11


类的本质

1,类也是个对象
> 其实类也是一个对象,是Class类型的对象,简称“类对象”
> Class类型的定义
typedef struct objc class *Class;
> 类名就代表着类对象,每个类只有一个类对象

2,获取类对象的2种方式
(1),Class c = [Person class];
(2),Person *p = [Person new];
Class c2 = [p class];

3,类对象方法举例
类对象调用类方法
Class c = [Person class];
Person *p2 = [c new];

+load和+initialize方法
1,程序启动时,就会加载项目中所有的类和分类,而且加载后会调用每个类和分类的+load方法。只会调用一次
2,当第一次使用某个类时,就会调用当前类的+initialize方法
3,先加载父类,再加载子类(先调用父类的+load方法,再调用子类+load方法)
   先初始化父类,再初始化子类(先调用父类的+initialize方法,再调用子类的+initialize方法)
   
description方法
默认情况下,利用NSLog和%@输出对象时,结果是:<类名:内存地址>

1,会调用对象P的-description方法

2,拿到-description方法的返回值(NSString *)显示到屏幕上

3,-description方法默认返回的时“类名+内存地址”

4,+description决定了类对象的输出结果

5,description方法体里面不能输出self,会造成死循环

6,方法示例

- (NSString *)description {

   return  [NSString stringWithFormat:@"name-%@",_name];

}


NSLog输出补充
输出行号
NSLog(@"%d",_LINE_);
输出当前函数名
NSLog(@"%s",_FUNC_);
输出源文件的名称
NSLog输出c语言字符串的时候,不能有中文

NSLog(@"%s",_FILE_);


SEL

原理

> SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去找对应的方法地址,找到方法地址就可以调用方法
> 每个类方法列表存储在类对象中
> 每个类的方法都有一个与之对应的SEL类型的对象
> 根据一个SEL对象就可以找到方法的地址,进而调用方法
> SEL类型的定义 typedef struct obic selector *SEL;
1,SEL使用
当对象调用方法时
(1),把方法包装SEL类型的数据
(2),根据SEL数据找到对应的方法地址
(3),根据方法地址调用对应的方法
调用方法可以用两种方式
直接用对象调用
[p test]
间接调用
[p performSelector:@selector(test)];

2,SEL对象的创造
SEL s=@selector(test);
SEL s2 = NSSelectorFromString(@"test");

3,SEL对象的其他用法
// 将SEL对象转为NSString对象
NSString *str = NSStringFromSelector(@selector(test));
Person *p=[Person new];
// 调用对象P的test方法
[p performSelector:selector(test)];

4,SEL 类型_cmd代表着当前方法

[self performSelector:_cmd]; 死循环


0 0