------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一:(self),(super)
在动态方法中:self代表着”对象”; 在静态方法中:self代表着”类”;
总结就是:self代表着当前方法的调用者;self 和 super 是Objective-C提供的两个保留字。
但有根本区别,self是类的隐藏的参数变量,指向当前调用方法的对象(类也是对象,类对象),另一个隐藏参数是_cmd,代表当前类方法的selector。super并不是隐藏的参数,它只是一个”编译器指示符”。
二:为什么要 self = [super init]
符合oc 继承类 初始化规范 super 同样也是这样, [super init] 去self 的super 中调用init super 调用 superSuper 的init 。
直到根类 NSObject 中的init ,根类中init 负责初始化 内存区域 向里面添加 一些必要的属性,返回内存指针, 这样 延着继承链 初始化的内存指针 被从上 到 下 传递,在不同的子类中向块内存添加 子类必要的属性,直到 我们的 A 类中 得到内存指针,赋值给slef 参数, 在if (slef){//添加A 的属性 }
三:举例说明
#import <Foundation/Foundation.h>
@interface EngineSuper : NSObject
-(void)printCurrentClass;
@end
#import "EngineSuper.h"
@implementation EngineSuper
-(void)printCurrentClass{
NSLog(@"=EngineSuper=======%@",[self class]);
}
@end
@interface Engine : EngineSuper
-(void)printSupClass;
@end
@implementation Engine
-(void)printSupClass{
[super printCurrentClass];
}
//调用:
Engine *engine = [[Engine alloc]init];
[engine printCurrentClass];//直接调用父类 方法,engine没重载 它
[engine printSupClass];//间接调用父类方法,
打印结果都是:Engine
Engine
方法体中 self 始终指代 方法的接收者 及对象 engine。,
换成 NSLog(@”=EngineSuper=======%@”,[super class]); 结果也是一样的。