self ? super ?

152 阅读2分钟

恩 猛的一看 好眼熟啊 莫非是我失散多年的兄弟? 好了不扯淡了

self 是干嘛的?代指本类实例 或者本类

super 不是关键子!!!记住了!!!它是个编译标记 指查找函数时从父类查找 不查找子类

那么我们常见的

-(void)viewDidLoad {

[super viewDidLoad];

}

该函数为什么要调用父类的方法的 这牵扯到继承链的知识 该方法的super调用会一直向上调用 直到让UIViewController所具有的功能都完备之后 再一层一层的函数出栈 构建好一个具有完整UIViewController实例所具备的功能  平时我们在该函数内部也会加上一些设置 添加试图等等操作 实质上是对 UIViewController功能的自定义扩充而已

如果不使用[super viewDIdLoad]继承链调用会在此环节中断掉 从而导致父类拥有的功能 子类缺无法继承 甚至直接奔溃或者报错 就好像想凭空而来一个函数 却像拥有他人的东西 这显然是不合理的

就好比 老子(老子指具有打江山的功能)打的江山 老子跪了儿子才能接班(儿子只具有管理江山的功能)  儿子在管理之前的基础是必须让老子先把江山打下来


就好像是我们调用super viewDid Load所谓的 子类能够使用父类的属性或者方法 在继承角度来看 只不过 子类实例有一个指针指向父类实例 说到底 子类拥有的一直是有子类开辟空间存储 父类也是如此 只不过 子类在生成的同时一个只属于他的父类实例   以方便子类调用父类属性或者方法 通过那根指向父类实例指针进行调用操作 而已  当父类替子类完成时 父类默默的工作 而子类却好像拥有父类的能力一样

实际的物理存储也是如此 从NSObject ->......-> UIViewController 都遵循这一规则 当我们自定义cell 不也是要写 super initWithStyle 吗 initWithFrame里面仔细看看 有木有

那么有人会说我们有时也会写很多函数里面都没有super xxxx 当然没有了 我们自定义的函数 基本可以看成一个 NSObject 所拥有的函数一样 本身就是老祖宗级别的 没有什么需要继承的吧 仔细想想吧 骚年们

super标记从当前对象向父类发送消息