OC中的self、super理解
来源:互联网 发布:gps nema数据 编辑:程序博客网 时间:2024/06/05 02:43
一段代码引发的思考:
12345678910111213@implementation
Son : Father
- (
id
)init
{
self
= [
super
init];
if
(
self
) {
NSLog
(@
"%@"
,
NSStringFromClass
([
self
class
]));
//Son
NSLog
(@
"%@"
,
NSStringFromClass
([
super
class
]));
//Son
}
return
self
;
}
@end
问题1:self 是什么 ?
问题2:super 是什么 ?
问题3:[super init] 到底做了什么 ?
问题4:为什么把 [super init] 的地址赋值给 self ?
问题5:为什么NSLog的输出都Son ?
一、答案区
答1:
1> self 是 OC 提供保留字;
2> self 代表着当前方法的调用者;
3> 在 - 方法中,self代表着"对象";
4> 在 + 方法中,self代表着"类";
5> self 是方法的隐藏的参数变量,指向当前调用方法的对象,另一个隐藏参数是 _cmd,代表当前类方法的selector。
答2:
1> super 是 OC 提供保留字;
2> super 不是隐藏的参数,它只是一个"编译器指示符"。查找方法时,指定方法查找的位置在父类。
答3:
1> 递归初始化父类对象,直到root对象;
答4:
1> 整个对象过程中只有一个对象 self ,不存在父类对象的指针;
2> 对象内部不管是 self 还是 super 其消息主体只有一个就是 self ,也就是说 self 和 super 指向的是同一个对象;
3> 在父类初始化失败的时候,返回nil,终止操作。
答5:
1> 参见 答4 ,结果显而易见,self 和 super是同一个实体。
二、疑惑区
解析:
1> 面向对象过程中,子类继承父类,就拥有了父类所有的属性方法,一个完整的类的初始化包括子类初始化和父类初始化。
2> 子类 [alloc init] 后,首先这里只有一个对象实体self,没有所谓的父类对象实体super。初始化过程中,父类属性、方法初始化都属于子类对象的一部分,super 的指针赋给 self 这一说法是错的,其实全部指的是该对象的初始位置。
总结的过程中参考了以下链接:
1. 关于 self 和 super 在 OC 中的疑惑与解析(帮助很大)
2. self = [super init] 的学习
3. self = [super init] 的思考
- OC中的self、super理解
- OC中的self和super
- oc中的 if(self=[super init])
- OC中的self和super(转载)
- 黑马程序员-OC语言中的两个关键字self和super
- 黑马程序员---iOS基础---OC中的self、super
- OC中self和super
- OC中self与super
- OC语言self和super
- OC-继承,多态,self,super
- self与super 怎么理解?
- self = [super init]理解
- OC语言中的self
- oc继承self,super的作用
- OC中self和super的使用
- OC 中 self 与 super 总结
- if(self=[super init]) 理解
- iOS 中self和super如何理解?
- cocos2dx win平台集成使用protobuf
- iOS多线程编程(三)------ NSOperation
- MFC学习笔记之-对话框
- LIGHTOJ 1045 - Digits of Factorial 【阶乘取对数】
- php curl_init函数用法
- OC中的self、super理解
- LightOJ 1043 Triangle Partitioning
- Tween 静态动态加载
- 数据完整性约束
- zabbix配置问题
- 顺序表应用2:多余元素删除之建表算法
- hdu5787 数位dp
- struts学习遇到问题之一 action
- Codeforces Round #368 (Div. 2) A Brain's Photos(水)