OC 中 self 与 super 总结
一段代码引发的思考:
@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 中的疑惑与解析(帮助很大)
最新文章
- Tomcat 7最大并发连接数的正确修改方法
- ASP.NET MVC进阶一
- Char、AnsiChar、WideChar、PChar、PAnsiChar、PWideChar 的用法
- some knowledge of maven {maven实战}
- 用java程序模拟网站的登录以及文件批量上传
- TransactionScope 对该事务的状态无效 和一些注意事项
- VC++ try catch (转)
- Java学习之基本数据类型
- ORACLE 分页查询
- spring源码 — 四、MVC
- django添加控件
- usb2.0、usb3.0、usb3.1、type-c 接口含义与区别
- oracle(八)块清除
- 深入Animation,在SurfaceView中照样使用Android—Tween Animation!
- 事件ID:7026(“下列引导或系统启动驱动程序无法加载: cdrom”)的解决方法
- 4.airflow测试
- ftp之心脏病
- dom4J使用笔记
- C#——DataGridView选中行,在TextBox中显示选中行的内容
- 用URL传参带特殊字符,特殊字符丢失
热门文章
- 问题:C# Dictionary嵌套使用;结果:嵌套Dictionary添加 , C#2.0泛型详细介绍
- hive查询ncdc天气数据
- Math类简介
- Linux下统计代码行数
- hive-0.12.0-cdh5.1.0安装
- 【MySQL】MySQL悲观锁 + 事物 + for update 解决普通流量并发的问题
- Struts2学习第七课 ActionSupport
- 22. CTF综合靶机渗透(十五)
- IQA(图像质量评估)
- 蚂蚁金服HR电话面