Objective-C语言的 if ( self = [super init] )
我们先假设如今自己创建了个类。我们起名叫MyObject,继承于NSObject。 继承知道吧,就是你这个子类(MyObject)假设什么都不写的话,和父类(NSObject)就是一模一样的。
OC里差点儿全部的类的根源都是NSObject。都是在NSObject的基础上添加成员变量、函数。 父类不是你自己写的类,你不敢保证它是安全的。是否能成功初始化。你有可能不知道里面是什么样子的。 self = [super init],你可能对这步做法可能难以理解。 self指向了父类初始化的内存地址。 类的初始化函数假设失败会返回nil。随后self也为nil。 那么 if(self = nil),你往下的初始化工作都是对nil做的,初始化失败。
假设还想有更深的理解请看以下一段:
父类进行初始化时,用的是子类对象指针self。父类的init方法有可能对这个指针指向的内存区作了大的变更(有可能把这个指针所指的内存释放了,又一次分配了还有一块内存区域返回来。这时这个返回的指针与原来的指针是指向不同地址的)。所以父类初始化后要又一次返回指针。 父类返回的和子类的self的类型都为id类型(通用类型)。父类的init方法若返回的指针与self不一样。在父类的init方法中已作了release和新的内存分配,不须要自己再去release self,直接用父类init方法返回的指针就能够了。 if ( self = [super init] )
{
仅仅要知道你须要在此你初始化的工作就可以 } return self;
基类里面是不须要这个的。都是在子类里面才用得到。[super init]是使用父类进行初始化,看看父类能不能被初始化,假设不能被初始化,子类就没法继承父类的属性和方法了。这个子类就没意义了。不能拥有父类的属性。所以,在这个地方加上if(self = [super init]),就是用来推断这个的。不能继承的话。就直接返回空对象(没有意义)。
Objective-C语言的 if ( 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 ...
随机推荐
- webstorm 设置ES6语法支持以及添加vuejs开发配置
参考文章:https://blog.csdn.net/diligentkong/article/details/75040651
- socket编程(Java实现)
主要是前段时间学习的网络知识的基于TCP与UDP编程,Java实现简单的大小写字母的转化,该文主要参考: https://blog.csdn.net/yjp19871013/article/detai ...
- js使用canvas在前端压缩图片
HTML代码: <input id="file" type="file"> JS代码: var eleFile = document.querySe ...
- mysql jdbc驱动与java 版本对应关系
当使用某些密码套件时,Connector/J5.1需要JRE 1.8.x才能使用SSL/TLS连接到MySQL 5.6,5.7和8.0.
- js 技巧 (二)
//最小化,最大化,关闭 <object id=min classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11"> & ...
- 集训第六周 E题
E - 期望(经典问题) Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit S ...
- uva 1592 Database (STL)
题意: 给出n行m列共n*m个字符串,问有没有在不同行r1,r2,有不同列c1,c2相同.即(r1,c1) = (r2,c1);(r1,c2) = (r2,c2); 如 2 3 123,456,789 ...
- NRF24L01注意点
nrf24L01被设置为接收模式后,可通过6个不同的数据通道(data pipe)接收数据. 每个数据通道都有一个唯一的地址但是各数据通道的频率是相同的.这意味着可以有6个被配置成发送状态的nRF24 ...
- Python之条件 循环和其他语句 2014-4-6
#条件 循环和其他语句 23:30pm-1:431.print和import的更多信息 使用逗号将多个表达式输出 >>> print 'age:',42 age: 42 >&g ...
- [K/3Cloud] 树形单据体的应用说明
1.BOSIDE制作单据,支持动态表单,单据,基础资料,报表等域模型. 2.添加列,和原来单据体一样. 3.设置主键列名,父级主键字段名,行类型字段名,节点图片字段名(没有可以为空) 4.运行时展 ...