Objective-C语言的 if ( self = [super init] )啥意思?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Objective-C语言的 if ( self = [super init] )啥意思?相关的知识,希望对你有一定的参考价值。

Objective-C语言的 if ( self = [super init] )什么意思?

别和我说: 若要初始化子类就必须初始化父类什么的,书上网上全是这么说,我表示这样说我看不懂,
哪位高端娴熟程序员能仔细点给我指导下,谢谢了。
50分全部家当,全部送上.

我只能说尽力尝试用不晦涩的方式为你解释
我们先假设现在自己创建了个类,我们起名叫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;
参考技术A 基类里面是不需要这个的,都是在子类里面才用得到。[super init]是使用父类进行初始化,看看父类能不能被初始化,如果不能被初始化,子类就没法继承父类的属性和方法了。这个子类就没意义了,不能拥有父类的属性。所以,在这个地方加上if(self = [super init]),就是用来判断这个的。不能继承的话,就直接返回空对象(没有意义)。 参考技术B 相当于if ( self = [super init] && self != nil )而已

Objective-C类的构造函数和析构函数

 构造函数:

Objective-C是一门面向对象的语言,我们在Objective-C中定义一个类时,总要提供一个初始化方法,一般大家都是这样写的:

- (id)init {  
    //调用父类方法,实例一个本类,涉及runtime,防止冲突,可以在构造方法里初始化一些数据等  
    self = [super init];  
    if (self) {  
        self.name = @"xxx";  
    }  
    return self;  
}

- (id)initWithString:(NSString *)aString
{ 
    [self init];
    self.name = aString;   
} 
  
- (id)initWithImage:(UIImage *)aImage
{ 
    [self init];
    self.image = aImage;   
}

这样一段简单的代码,却有很多可以思考的问题:  

1、为什么要通过[super init]来调用父类的初始化方法,父类的初始化方法里又执行了什么东西?

首先,我们知道对象继承的概念,一个子类从父类继承,那么也要实现父类的所有功能,这就是is-a的关系,比如说狗是哺乳动物,那么狗必定具有哺乳动物的特征和功能。所以在子类的初始化方法中,必须首先调用父类的初始化方法,以实现父类相关资源的初始化。例如我们在初始化狗这一对象时,必须先初始化哺乳动物这一对象,并把结果赋予狗,以使狗满足属于哺乳动物这一特征。

典型的,在iOS下,所有的类都继承于NSObject,而NSObject的init方法很简单,就是return self。当父类的初始化完成之后,即self不为nil的情况下,就可以开始做子类的初始化了。

 

在面向对象编程中,如果编写一个类而没有包含构造函数,这个类仍能编译并且完全可以正常使用。如果类没有提供显式的构造函数,编译器会提供一个默认的构造函数给你。除了创建对象本身,默认构造函数的唯一工作就是调用其超类的构造函数。在很多情况下,这个超类是语言框架的一部分,如java中的 Object类,objective-c 中的NSObject类。

不论是何种情况,在类中至少包含一个构造函数是一种很好的编程实践,如果类中有属性,好的实践往往是初始化这些属性。

 

析构函数 

析构函数dealloc,对象从内存中销毁前夕调用的函数

- (void)dealloc  
{  
    //析构函数是在对象完全销毁的时候自动调用  
    //对象销毁的时候调用 计数器 retainCount = 0  
    //dealloc 不可以人为调用  
    //在dealloc里清除成员变量,代理,监听等  
    self.color = nil;  
    self.linePoints = nil;  
    [super dealloc];  
}

 

以上是关于Objective-C语言的 if ( self = [super init] )啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

什么时候在 Objective-C 中使用`self`?

Objective-C init/initWithFrame调用机制

Objective-c:关于self = [super init]的问题

将 MKPolygon Objective-C 代码转换为 Swift

如何在objective-c中使UIImage为NULL

objective-c 抽奖转盘(原创)