本帖最后由 wowthe1st 于 2015-7-31 13:57 编辑
- #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__);
- }
- @end
- int 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];
- }
- */
复制代码 刚才发的一份出现错误了,重发一份
|
|