[size=17.77777862548828px]
Class类型:
[size=17.77777862548828px]typedef struct objc_class{
....
} *Class
Class类也继承NSObject,而且类加载后的类对象(即Class类的实例)中的isa指针指向Class类;
NSObject中class方法实现伪代码:
-(Class)class
{
return self->isa;
}
+(Class)class
{
return self;
}
id *p=[[[NSObject class] alloc] init] 等价于 [[NSObject alloc] init]
类的加载和初始化:
//类按从父类到子类的顺序加载
//当程序启动,加载一次项目中所有的类,在类加载完后调用load方法(只加载一次)
//类与分类是分别加载,所有类与分类中的load方法都会被调用
+(void)load
{
//doSomething
}
//类按从父类到子类的顺序初始化
//当程序中第一次使用某个类时调用其initialize方法,只初始化一次
//类与分类是一起初始化,分类的initialize方法会覆盖类中的该方法
+ (void)initialize
{
//doSomething
}
SEL类型:
typedef struct objc_selector{
.....
} *SEL
1>方法调用的消息机制中,消息即SEL
2>OC中每个方法类的方法都存在类对象中,每个方法都有一个与之对应的SEL类型对象
3>每个方法的参数列表中都有一个SEL类型的隐藏参数_cmd,代表当前方法的SEL
4>方法调用过程:
将方法名包装成SEL类型数据
跟据SEL数据找到对应的方法地址
根据方法地址调用方法
将方法名包装成SEL:
SEL s=@selector(test);
将方法名的OC字符串包装成SEL:
SEL s=NSSelectorFromString(@"test");
从SEL中获取方法名的OC字符串:
NSString *str=NSStringFromSelector(s);
方法调用其他形式:
[p test] 等价于 [p performSelector:@selector(test)];
[p test:@"aaaaa"]等价于[p performSelector:@selector(test:) withObject:@"aaaaa"];
description方法:(NSObject的方法,类似java中toString)
%@输出格式,即调用OC对象的description方法后输出返回的NSString*
[size=17.77777862548828px]
NSObject中实现的伪代码:
- (NSString *)description
{
return [NSString stringWithFormat:@"<%@: %p>",[self class],self];
}
+ (NSString *)description
{
return [self className];
}
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |