关于 objective - C 的 super init

[super init] 的结果可能有三种:
  第一种:  [super init] 初始化成功,这个是最最正常的情况。
  第二种:    [super init] 初始化失败,我们都知道oc的两步创建,alloc开辟内存空间,init初始化对象,但是init还有另外一个作用,在初始化失败的时候,init方法会返回一个nil。回头行文的最上面,如果self为nil,那么if(self)语句的内容,将不被执行,已确保程序健壮安全。
  - (instancetype)init
  {
      self = [super init]; // call the designated initializer
      if (self) {
        // Custom initialization
    }
      return self;
  }
  第三种:self = [super init]执行之后,内存指向了不相关的地址。这种情况的出现,一般是一下几种情况:单例、类簇、对象为NSNumber类型、父类在初始化的时候释放了当前对象,然后重新开辟了新的内存地址。

为什么要使用 [super init]使用《禅与 Objective-C 编程艺术》的原话来回答:这样做,你看你会得到一个不能用的对象,并且它的行为是不可预测的,最终可能会导致你的 app 发生 crash。用通俗易懂的话回答:if( self = [super init] )这是一种通常的建议写法,赋值并测试nil只是为了防止超类在初始化过程中发生改变,返回了不同的对象。
时间: 2024-07-30 00:44:01

关于 objective - C 的 super init的相关文章

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

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

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

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

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

[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]

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

[转] "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了一块空间.这时的话,[

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

对象初始化有两种方式:[class new] 与 [[class alloc] init] 对于后者,有分配和初始化的过程,alloc 从应用程序的虚拟地址空间上为该对象分配足够的内存,并且将新对象的引用计数加1.将对象的成员变量初始为零,init 会做真正的初使化工作,为对象的实例变量赋予合理有用的值. 一般不推荐使用[class new],而推荐使用[[class alloc] new],查看源码分析一下: + new { id newObject = (*_alloc)((Class)se

iOS self = [super init]

self = [super init] 这个问题一直不太明白,今天研究了一下,在stackoverflow找到了下面的答案: http://stackoverflow.com/questions/2956943/why-should-i-call-self-super-init 我对这些答案简单翻译总结下: 要明白这个问题,首先要知道self 是什么东西,我们什么时候会用到self.