OC学习笔记06--OC运行时中类的加载、初始化 和方法调用机制,SEL类型
来源:互联网 发布:短信轰炸php源码 编辑:程序博客网 时间:2024/05/28 03:03
#import <Foundation/Foundation.h>void printMethodInfo(id self,Class clz,SEL _cmd,int line){NSLog(@"调用者=%@,当前类=%@,调用方法=%@,行数=%d",self,[clz className],NSStringFromSelector(_cmd),line);}// SuperClass@interface SuperClass : NSObject@end@implementation SuperClass + (void)load{printf("当前所在文件:%s,",__FILE__);// %s输出char*,若遇到中文在NSLog中将无法输出,改成利用printf输出//第一次调用SuperClass时,会进行初始化,初始化只进行一次NSLog(@"调用者=%@,当前类=%@,调用方法=%s,当前行数=%d",self,[SuperClass className],__func__,__LINE__);}+ (void)initialize{printMethodInfo(self,[SuperClass class],_cmd,__LINE__);}@end// SubClass@interface SubClass : SuperClass@end@implementation SubClass + (void)load{printMethodInfo(self,[SubClass class],_cmd,__LINE__);}+ (void)initialize{printMethodInfo(self,[SubClass class],_cmd,__LINE__);}@end// SubClass (Category)@interface SubClass (Category)@end@implementation SubClass (Category)//分类与本类的load方法都被调用,说明分类与本类是分别加载的+ (void)load{printMethodInfo(self,[SubClass class],_cmd,__LINE__);}//从行号可以看出,分类与本类只调用了分类的初始化方法,说明分类初始化方法覆盖了本类+ (void)initialize{printMethodInfo(self,[SubClass class],_cmd,__LINE__);}@endint main(){SubClass * subclz=[[[SubClass class] alloc] init];//%@打应对象,会先调用对象的description方法返回NSString*后输出,//NSObject中该方法实现为返回<类名: 指针值>//重写该方法返回想要的值NSLog(@"subclz=%@,指针值=%p",subclz,subclz);NSLog(@"subclz=%@,指针值=%p",[subclz description],subclz);NSLog(@"subclz=%@,指针值=%p",[subclz performSelector:@selector(description)],subclz);NSLog(@"subclz=%@,指针值=%p",[subclz performSelector:NSSelectorFromString(@"description")],subclz);//上面调用的四中方式是等效的return 0;}/*NSLog:输出char*时,不允许有中文__func__ 当前函数签名 %s__LINE__ 当前行号 %d__FILE__ 当前文件路径 %s*/
Class类型:
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*
NSObject中实现的伪代码:
- (NSString *)description
{
return [NSString stringWithFormat:@"<%@: %p>",[self class],self];
}
+ (NSString *)description
{
return [self className];
}
- OC学习笔记06--OC运行时中类的加载、初始化 和方法调用机制,SEL类型
- OC学习笔记SEL类型初步理解
- OC学习:SEL类型数据和selector的用法
- OC关键字@property、@synthesize和id类型、构造方法、分类categary、类的本质、description方法、SEL消息机制
- OC - SEL类型的使用
- OC基础学习——SEL(选择器类型)和Class的学习
- OC基础—description方法、SEL类型
- OC-SEL类型
- OC-033.SEL类型
- Objective-C学习笔记(四):OC之分类、类对象、description方法和SEL
- 黑马视频学习笔记-OC-SEL
- OC语言description方法和sel
- OC中description方法和sel
- OC语言description方法和sel
- OC语言description方法和sel
- OC语言12-description方法和sel
- OC 类的加载和初始化
- OC语言--SEL类型小记
- C#与VC++数据类型对应关系
- ibatis事物管理不起作用
- rtt
- mssoap与gsoap访问WebService的使用
- Linux系统(X64)安装Oracle11g
- OC学习笔记06--OC运行时中类的加载、初始化 和方法调用机制,SEL类型
- MD5算法介绍及jdk自带实现方式
- viewpager两层嵌套+内层循环滑动
- C# StructLayouAttribute属性
- linux ip地址设置(静态)
- 基于 Selenium WebDriver 的 Web 应用自动化测试
- linux识别ntfs文件系统
- 【HDOJ 5335】Walk Out
- 非对称加密算法-DH算法