我们先假设如今自己创建了个类。我们起名叫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] )的更多相关文章

  1. [转] "self = [super init]"的解释与潜藏bug

    Objective-C的推荐init方法写法如下: - (id) init { if(self = [super init]) { //为子类增加属性进行初始化 } return self; } 这里 ...

  2. OC self = [super init] , 点语法 , @property

    OC self = [super init] , 点语法 , @property 构造方法为啥这么写? self = [super init]; [super init] 的结果可能有三种: 第一种: ...

  3. iOS self = [super init]

    self = [super init] 这个问题一直不太明白,今天研究了一下,在stackoverflow找到了下面的答案: http://stackoverflow.com/questions/29 ...

  4. [super init]方法的调用

    当重新覆盖父类的init方法时,需要调用[super init]方法确认父类中的init是返回一个实例,而不是一个空的实例. 那为什么要调用这个呢? 我得猜测是这样的:因为这是一个初始化方法,需要对对 ...

  5. Swift - Property ''not initialized at super.init call

    Property ''not initialized at super.init call 这个错误应该挺常见的的,为什么在百度上没有找到呢,stack over flow找到了,也不能说是什么解决办 ...

  6. 刨根问底:对于 self = [super init] 的思考

    对象初始化有两种方式:[class new] 与 [[class alloc] init] 对于后者,有分配和初始化的过程,alloc 从应用程序的虚拟地址空间上为该对象分配足够的内存,并且将新对象的 ...

  7. 关于self和super在oc中的疑惑与分析 (self= [super init])

    这个问题貌似很初级,但很容易让人忽略,me too .直到在一次面试时被问到,稀里糊涂的回答了下.实在惭愧, 面试一定都是很注重 基础的,不管高级还是初级. 虽然基础好跟基础不好都可以写代码,网上那么 ...

  8. swift中的如果在构造方法中使用KVC, 调用了super.init(), 报错, 基本数据类型属性找不到

    swift要求, 属性必须有初始化值, 如果不对其赋值, 可以加一个?系统会默认给其包装一个可选值(直说就是nil) 如果定义一个基本类型, 建议直接赋值, 不建议使用? 下面说下标题中的问题 有时候 ...

  9. self = [super init] 最终解释

    答:      init 中调用super的 init方法来初始化自己所包含有的父类信息 1.内存分配      内存应该在[Class alloc]的时候就已经分配了,大小和类型应该由对应的Clas ...

随机推荐

  1. CAD绘制固定矩形标注(网页版)

    js中实现代码说明: function DoFixRectComment() { var ent = mxOcx.DrawCustomEntity("TestMxCustomEntity&q ...

  2. 导入.sql文件入数据库

    1.创建数据库,例如abc create database abc; 2.进入数据库 use abc 3.导入e盘下的ssh.sql文件即可 source e:\ssh.sql; 截图如下:

  3. MRC转ARC

    转载请注明出处:http://blog.csdn.net/cywn_d/article/details/18222671 1.删除所有retain,release和autorelease. 2.把原来 ...

  4. CF1000G Two-Paths

    题目大意:给你一棵树,其中点上和边上都有值.定义2-Path为经过一条边最多两次的路径,价值为经过点的权值加和-经过边权值*该边经过次数.4e5组询问,每次询问树上连接x,y两点的2-Path的最大价 ...

  5. Linux环境搭建SVN服务

    一.准备工作 首先要保证自己的linux电脑能上外网,我这电脑因为是新的,没有配置网络,所以再这块花费了点时间. 1.检查ip信息 >ifconfig 2.检查DNS服务器 >cat  / ...

  6. nodejs学习(二) ---- express中使用模板引擎jade

    系列教程,上一节教程  express+nodejs快速创建一个项目 在创建一个项目后,views目录下的文件后缀为 .jade . 打开 index.jade,具体内容如下图(忽略 header.j ...

  7. [转]TOpenDialog

    转自:http://www.cnblogs.com/zhangzhifeng/archive/2011/08/04/2127395.html 1.TOpenDialog组件的典型用法“打开”对话框是用 ...

  8. PHP实现QQ第三方登录的方法

    前言: PHP实现QQ快速登录,罗列了三种方法 方法一:面向过程,回调地址和首次触发登录写到了一个方法页面[因为有了if做判断], 方法二,三:面向对象 1.先调用登录方法,向腾讯发送请求,2.腾讯携 ...

  9. Rim 边缘光

    边缘光:计算眼睛和模型顶点法线的点积,结果作为强度,和材质输出:顶点和法线平行时,强度最大,垂直时,强度最小.因此将他取反,即同一方向时,强度最小,垂直时,强度最大. -dot(normalize(v ...

  10. 将 Oracle VirtualBox 中运行的虚拟机导入 VMware Fusion、Workstation 或 Player

    1.从virtualbox种导出电脑为 .ova格式镜像 要导入 Oracle VirtualBox 中运行的虚拟机,必须将该虚拟机从 VirtualBox 导出到开放虚拟化格式存档(.ova 文件) ...