关于 self = [super init];
- - (id)init {
- self = [super init]; // Call a designated initializer here.
- if (self != nil) {
- // 省略其他细节
- }
- return self;
- }
容易让人困惑的地方在于,将父类初始化之后,将其返回的对象指针覆盖当前对象的指针。
这种方式令人费解,目前暂时找不到官方解释这么做的原因。
官方文档 有解释。
我们先分以下几种情况分别分析:(假设superSelf是[super init]的返回值)
1 superSelf == nil
此时父类初始化失败,self随之被赋值为nil并返回,表现正常。
2 superSelf == self
大部分类的初始化都是这个结果。此时赋值没有任何影响。
3 superSelf != self
这种情况正是大部分人疑惑的地方。执行self = [super init]之后,
我们创建的对象将会被重定向到另外一块内存上。接下来重点解释这种情况。
首先,出现父类指针跟子类指针不一样的情况其实就是父类的init方法返回的对象跟原先创建的对象不一样,分为以下几种:
1 单件。
此时如果执行self = [super init]将使所有子类指向这个单件的内存。
这不仅使所有子类互相修改数据,甚至访问子类自己增加的变量的时候,可能会崩溃。
建议不要继承单件、或者保证单件的子类也是单件。
2 ClassClusters(类簇),初始化方法返回了不同的子类。
以下是对象初始化后,返回不同的子类的例子:
- NSString *str1 = [NSString alloc];
- NSString *str2 = [str1 initWithString:@"hello"];
上面的str1和str2是不一样的对象,存在于不同的内存块中,在GNUStep里面,str1是GSPlaceholderString对象,str2是GSCInlineString对象。
3 共享。
先看例子:
- NSNumber *n1 = [[NSNumber alloc] initWithInt:1];
- NSNumber *n2 = [[NSNumber alloc] initWithInt:1];
以上的n1和n2,指向了同一块内存!
由于NSNumber是创建之后就不能修改的对象,所以Foundation在这里做了一些优化,相同数值的NSNumber对象将共享同一块内存。
4 父类可能在初始化中释放了当前的对象并创建了新的内存区域。
这时,子类需要将self指向新的内存区域才能正常工作。所以一定要执行self = [super init];
总结:
在初始化方法中使用self = [super init]语句是Objective-C的标准做法。
一般情况下都要用以上语句来防止父类改变对象的内存地址导致self指针指向无效内存。
在父类是单件、类簇或者有共享资源的时候,必须依照实际情况考虑是否加上这行代码。
总之,当需要继承父类的时候,调用父类的init之前,必须知道父类的init方法的工作方式。
关于 self = [super init];的更多相关文章
- [转] "self = [super init]"的解释与潜藏bug
Objective-C的推荐init方法写法如下: - (id) init { if(self = [super init]) { //为子类增加属性进行初始化 } return self; } 这里 ...
- OC self = [super init] , 点语法 , @property
OC self = [super init] , 点语法 , @property 构造方法为啥这么写? self = [super init]; [super init] 的结果可能有三种: 第一种: ...
- iOS self = [super init]
self = [super init] 这个问题一直不太明白,今天研究了一下,在stackoverflow找到了下面的答案: http://stackoverflow.com/questions/29 ...
- [super init]方法的调用
当重新覆盖父类的init方法时,需要调用[super init]方法确认父类中的init是返回一个实例,而不是一个空的实例. 那为什么要调用这个呢? 我得猜测是这样的:因为这是一个初始化方法,需要对对 ...
- Swift - Property ''not initialized at super.init call
Property ''not initialized at super.init call 这个错误应该挺常见的的,为什么在百度上没有找到呢,stack over flow找到了,也不能说是什么解决办 ...
- 刨根问底:对于 self = [super init] 的思考
对象初始化有两种方式:[class new] 与 [[class alloc] init] 对于后者,有分配和初始化的过程,alloc 从应用程序的虚拟地址空间上为该对象分配足够的内存,并且将新对象的 ...
- 关于self和super在oc中的疑惑与分析 (self= [super init])
这个问题貌似很初级,但很容易让人忽略,me too .直到在一次面试时被问到,稀里糊涂的回答了下.实在惭愧, 面试一定都是很注重 基础的,不管高级还是初级. 虽然基础好跟基础不好都可以写代码,网上那么 ...
- swift中的如果在构造方法中使用KVC, 调用了super.init(), 报错, 基本数据类型属性找不到
swift要求, 属性必须有初始化值, 如果不对其赋值, 可以加一个?系统会默认给其包装一个可选值(直说就是nil) 如果定义一个基本类型, 建议直接赋值, 不建议使用? 下面说下标题中的问题 有时候 ...
- self = [super init] 最终解释
答: init 中调用super的 init方法来初始化自己所包含有的父类信息 1.内存分配 内存应该在[Class alloc]的时候就已经分配了,大小和类型应该由对应的Clas ...
- self = [super init]
Objective-C的推荐init方法写法如下: - (id) init { if(self = [super init]) { //为子类增加属性进行初始化 } return self; } 返回 ...
随机推荐
- windows10下Python如何设置环境变量
1.右击“我的电脑”,选择“属性”, 2.选择“高级系统设置”, 3.选择“环境变量”, 4.在“系统变量”中选中“Path”,再点“新建”.(Python.Scripts两个目录都要加,只加Pyth ...
- 20165101刘天野 2018-2019-2《网络对抗技术》Exp3 免杀原理与实践
20165101刘天野 2018-2019-2<网络对抗技术>Exp3 免杀原理与实践 1. 实践内容 1.1 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil- ...
- JAVA基础补漏--多态
Fu obj = new ZI(); 访问成员变量规则 编译看左,运行看左. obj.num; 1.直接通过对象名访问成员变量:看等号左右是谁,优先用谁,没有则往上找. obj.getnum(); 2 ...
- VMware Workstation 12 增加磁盘容量 Windows Server 2012 系统 扩展
1.安装虚拟机后,检查C盘容量大小,发现C盘现在的空间是59.9GB,如下图: 2.使用window+R键,出现运行窗口,输入‘cmd’——>‘cd C:\Program Files (x86) ...
- 在NLP中深度学习模型何时需要树形结构?
在NLP中深度学习模型何时需要树形结构? 前段时间阅读了Jiwei Li等人[1]在EMNLP2015上发表的论文<When Are Tree Structures Necessary for ...
- gitlab 卸载
gitlab 卸载 清理命令 sudo gitlab-ctl uninstall sudo gitlab-ctl cleanse sudo gitlab-ctl remove-accounts 停止g ...
- 探秘DPDK Virtio的不同路径
什么是Vhost/Virtio Vhost/Virtio是一种半虚拟化的设备抽象接口规范, 在Qemu和KVM中的得到了广泛的应用,在客户机操作系统中实现的前端驱动程序一般直接叫Virtio, 在宿主 ...
- React菜鸟食谱
JSX 用小括号包裹代码防止分号自动插入的bug,用大括号包裹里面的表达式 切记你使用了大括号包裹的 JavaScript 表达式时就不要再到外面套引号了.JSX 会将引号当中的内容识别为字符串而不是 ...
- NSNumber 与NSValue
NSNumber与NSValue关系与作用 .由于集合里只能存放对象,不可以存放基本数据类型,所以我们有时候需要讲一些对象比如基本数据类型,结构体等存到NSDictionary NSArray中,我们 ...
- Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals)
Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals) A.String Reconstruction B. High Load C ...