——- android培训、java培训、期待与您交流! ———-
类的本质
类也是一个对象,是Class类型的对象,简称“类对象”
Class 类型的定义
typedef struct objc_class *Class;
类名就代表着类对象,每个类只有一个类对象
方法 + load 和 + initialize
load
在程序启动时会加载所有的类和分类,并调用所有类和分类的 + load 方法(不论有没有用到该类)
调用优先级: 父类 -> 子类 -> 分类
initialize
在第一次使用某个类时,就会调用一次 + initialize 方法
一个类只会调用一次 + initialize 方法,先父类后子类 (super)
获取类对象的方式
1.
Class c = [Person class]; // 直接调用类的class方法
2.
Person *p = [Person new];
Class c2 = [p class]; // 间接调用对象的class方法
类对象调用类方法
Class c = [Person class];
Person *p = [c new]; // 就是将类对象当做类名使用
description 方法
- description 方法
> 使用 NSLog 和 %@ 输出某个对象时,会调用对象的 - description 方法输出
+ description 方法
> 使用 NSLog 和 %@ 输出某个类对象时,会调用类对象 + description 方法输出
修改 NSLog 的默认输出
重写 - description 或者 + description 方法即可
SEL
类型的定义:
typedef struct objc_selector *SEL;
类 —–> 方法 <==> SEL
SEL 对象的创建
// SEL 对象前没有 *
1.SEL s = @selector(方法名);
// 注意有参数的方法名会带有:
2.SEL s = NSSelectorFromString(@"方法名");
// 获取字符串中的方法的SEL对象
SEL 对象的其他用法
// 将 SEL 对象转为 NSString 对象
NSString *指针变量名 = NSStringFromSelector(@selector(方法名));
// 通过 SEL 调用方法
SEL s = @selector(方法名); // 获取对应方法名的 SEL 对象
[对象名 performSelector : s]; // 对象调用 SEL 对象对应的方法
NSLog 输出增强
__FILE__ : 源代码文件名
__LINE__ : NSLog代码所在行数
__cmd : 代表着当前方法的SEL
——- android培训、java培训、期待与您交流! ———-