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]),就是用来判断这个的。不能继承的话,就直接返回空对象(没有意义)。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-22 17:18:35

Objective-C语言的 if ( self = [super init] )的相关文章

Objective-C语言的 if ( self = [super init] )22

我们先假设现在自己创建了个类,我们起名叫MyObject,继承于NSObject. 继承知道吧,就是你这个子类(MyObject)如果什么都不写的话,和父类(NSObject)就是一模一样的. OC里几乎所有的类的根源都是NSObject,都是在NSObject的基础上增加成员变量.函数. 父类不是你自己写的类,你不敢保证它是安全的,能否成功初始化,你有可能不知道里面是什么样子的. self = [super init],你可能对这步做法可能难以理解.self指向了父类初始化的内存地址.类的初始

关于 objective - C 的 super init

[super init] 的结果可能有三种: 第一种: [super init] 初始化成功,这个是最最正常的情况. 第二种: [super init] 初始化失败,我们都知道oc的两步创建,alloc开辟内存空间,init初始化对象,但是init还有另外一个作用,在初始化失败的时候,init方法会返回一个nil.回头行文的最上面,如果self为nil,那么if(self)语句的内容,将不被执行,已确保程序健壮安全. - (instancetype)init { self = [super in

Objective—C语言的新魅力——Nullability、泛型集合与类型延拓

Objective-C语言的新魅力 一.引言 在Xcode7中,iOS9的SDK已经全面兼容了Objective-C的一些新特性和新功能.这些功能都只作用于编译期,对程序的运行并没有影响,因此,它可以很好的向下进行兼容,无缝的衔接低版本的iOS系统,那么这些特性有什么样的用处呢,作为开发者,我保证你一定会爱上他们,如果你可以将这些新特性都应用于你的开发,你的开发效率和代码质量,相比之前,会有一个很大的提升. 二.Nullability检测的支持 在swift语言中,通过!和?可以将对象声明成Op

iOS核心语言Objective C语言 —— 内存管理

本分享是面向有意向从事iOS开发的伙伴以及苹果产品的发烧友们,或者已经从事了iOS的开发者,想进一步提升者.如果您对iOS开发有极高的兴趣,可以与我一起探讨iOS开发,一起学习,共同进步.如果您是零基础,建议您先翻阅我之前分享的iOS开发分分钟搞定C语言系列,然后在开始Objective C语言的学习,如果您遇到问题也可以与我探讨,另外将无偿分享自己整理出来的大概400G iOS学习视频及学习资料,都是干货哦!可以新浪微博私信?关注极客James,期待与您的共同学习和探讨!!由于时间有限,每天在

[Obj-C笔记] "self = [super init]"的解释与潜藏bug

转自:http://blog.csdn.net/aoyuehan11/article/details/10268231 Objective-C的推荐init方法写法如下: - (id) init { if(self = [super init]) { //为子类增加属性进行初始化 } return self; } 这里涉及了几个问题, 1. [super init]的作用: 面向对象的体现,先利用父类的init方法为子类实例的父类部分属性初始化. 2. self 为什么要赋值为[super in

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

Objective-C的推荐init方法写法如下: - (id) init { if(self = [super init]) { //为子类增加属性进行初始化 } return self; } 这里涉及了几个问题, 1. [super init]的作用: 面向对象的体现,先利用父类的init方法为子类实例的父类部分属性初始化. 2. self 为什么要赋值为[super init]: 简单来说是为了防止父类的初始化方法release掉了self指向的空间并重新alloc了一块空间.这时的话,[

init()方法必须使用super.init(config)的原因--Servlet

原 因: 一个servlet在它的init()方法中传递它的ServletConfig实例,在其他的方法中却不可以.当一个servlet在 init()方法外需要调用config对象时就会产生问题.使用super.init(config)语句就解决了这个问题,该语句通过唤醒 GenericServlet的init()方法, 该方法保存了这个config对象的一个引用,以备将来使用.那么,一个servlet是怎样利用这个保存的引用的呢?是通过自身唤醒方法.在执行 中,GenericServlet类

关于 self = [super init];

[plain] view plaincopyprint? - (id)init { self = [super init]; // Call a designated initializer here. if (self != nil) { // 省略其他细节 } return self; } 容易让人困惑的地方在于,将父类初始化之后,将其返回的对象指针覆盖当前对象的指针. 这种方式令人费解,目前暂时找不到官方解释这么做的原因. 官方文档 有解释. 我们先分以下几种情况分别分析:(假设super

self = [super init]

Objective-C的推荐init方法写法如下: - (id) init { if(self = [super init]) { //为子类增加属性进行初始化 } return self; } 返回值为id类型,id类型可以赋值给其他类型指针,其他类型指针也可以赋值给id类型 obc中子类指针不能直接赋值给父类指针 [super init]也是返回self,再不改变self所指向对象的情况下,这个self跟子类的self是一样的,因为转化为消息调用时传入的Receiver都一样 如果在父类中改