关于 self 和 supe…
来源:互联网 发布:基金止盈软件 编辑:程序博客网 时间:2024/05/16 12:22
这个问题貌似很初级,但很容易让人忽略,me too 。直到在一次面试时被问到,稀里糊涂的回答了下。实在惭愧,
面试一定都是很注重 基础的,不管高级还是初级。
虽然基础好跟基础不好都可以写 代码,网上那么多资料。
开始我们的问题:
@implementation Son : Father- (id)init{ self = [super init]; if (self) { } return self;}
这段代码 估计很多人都 写烂了,就算没写烂,xcode 自动生成的 我们也看吐了。 好吧,来说说原来,
上来就是 : 这个其实就是 在子类实现初始化前 调用父类的init实现.
这跟没说一样,稀里糊涂的。
首先这个问题,要了解
一个一个来:
1,self
self 和 super 是oc 提供的 两个保留字。 但有根本区别,
2,
发送消息时
Class A
-reposition { ... [self setOrigin:someX :someY]; ... }
[a
[self setOrigin:someX :someY];
objc_msgSend(id self,SEL _cmd, ...) 。self -> a
同样如果
Class A-reposition { ... [super setOrigin:someX :someY]; ... }
[a
[super setOrigin:someX :someY];
其转换为
id objc_msgSendSuper(struct objc_super *super, SEL op, ...)
struct objc_super {
};
[super setOrigin:someX :someY]
setOrigin
3,为什么要 self =
符合oc 继承类 初始化规范 super 同样也是这样,
根类中init 负责初始化 内存区域
下面来看看这个:
@implementation Son : Father- (id)init{ self = [super init]; if (self) { NSLog(@"%@", NSStringFromClass([self class])); NSLog(@"%@", NSStringFromClass([super class])); } return self;}@end
应该不难分析出
Son
Son
当 发送 class 消息 时不管是 self 还是 super 其消息主体依然是 self ,也就是说 self 和 super 指向的 是同一个对象。只是 查找方法的位置 区别,一个从本类,一个从本类的超类。
一般情况下 class 方法 只有在 根类 NSObject 中定义,极少情况有子类重写 class 方法,
所以 [slef class] 和 [super class] 都是在 根类中 找方法实现, 消息接收主体 又都是 a
如果重写可能会不一样。
自然都打印出 Son
在来一个例子:
#import @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]); 结果也是一样的。
super 就是个障眼法 发,编译器符号, 它可以替换成 [slef class],只不过 方法是从 self 的超类开始 寻找。
- 关于 self 和 supe…
- 关于alter system switch lo…
- 关于wait, WIFEXITED和 …
- 关于 Nginx 499 和…
- 解决 [self.tableView s…
- 实验1 :关于FLASHBACK DATABASE …
- 关于 adding a new disk or removi…
- IOS 开发 loadView 和 viewDidLoad…
- C# StreamReader 和 StreamWriter …
- set unused column column_name 和…
- dive into python 第 5 章 对象和…
- 总结: 全排列 和 全部子集 (深搜…
- 集线器 交换机 路由器 网桥 …
- 关于mysql query cache和memcached…
- 关于struts2 和velocity 配置后,t…
- 使用BBED修改SCN …
- Self Numbers
- Hive安装 …
- GCD介绍: 基本概念和Dispatch…
- 并发编程之Operation Queue和GCD
- Swift 编程语言入门教程
- Android头部状态栏SystemBarTint
- instancetype 与 id&nbs…
- 关于 self 和 supe…
- HTTP和HTTPS
- iOS开发之GCD使用总结
- R语言-集合操作
- <转>iOS开发多线程篇—GCD介绍
- <转>iOS的socket开发基础
- iOS App 名字国际化的办法
- 8.c/c++程序员面试宝典-switch语句
- ios开发学习--音频声效(Audio)效…