浅谈 Objective-C 下对象的初始化

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

[color=initial !important][table=0px !important][tr][td]1[/td][td]- (MyClass *)init[/td][/tr][/table]
[color=initial !important][color=initial !important][color=initial !important][table=0px !important][tr][td]5[/td][td] //执行一些资源、变量的初始化工作[/td][/tr][/table]
[color=initial !important][color=initial !important][table=0px !important][tr][td]8[/td][td]}[/td][/tr][/table]

这样一段简单的代码,却有很多可以思考的问题:
1、为什么要通过[super init]来调用父类的初始化方法,父类的初始化方法里又执行了什么东西?
      首先,我们知道对象继承的概念,一个子类从父类继承,那么也要实现父类的所有功能,这就是is-a的关系,比如说狗是哺乳动物,那么狗必定具有哺乳动物的 特征和功能。所以在子类的初始化方法中,必须首先调用父类的初始化方法,以实现父类相关资源的初始化。例如我们在初始化狗这一对象时,必须先初始化哺乳动 物这一对象,并把结果赋予狗,以使狗满足属于哺乳动物这一特征。
     典型的,在iOS下,所有的类都继承于NSObject,而NSObject的init方法很简单,就是return self。当父类的初始化完成之后,即self不为nil的情况下,就可以开始做子类的初始化了。
2、是否一定要提供初始化方法,是否一定要使用init作为初始化方法?
     我们在Objective-C中创建一个对象通常使用

[color=initial !important][table=0px !important][tr][td]1[/td][td]MyClass *newclass = [[MyClass alloc] init];[/td][/tr][/table]     或者
[color=initial !important][table=0px !important][tr][td] [/td][td]
MyClass *newclass = [Myclass new];  [/td][/tr][/table]
[color=initial !important][color=initial !important][table=0px !important][tr][td]05[/td][td]  [/td][/tr][/table]
[color=initial !important][color=initial !important][color=initial !important][table=0px !important][tr][td]13[/td][td] self.name = aString;  [/td][/tr][/table]
[color=initial !important][color=initial !important][color=initial !important][table=0px !important][tr][td]19[/td][td] self.image = aImage;  [/td][/tr][/table]
[color=initial !important][table=0px !important][tr][td]20[/td][td]}[/td][/tr][/table]

补充:


在 面向对象编程中,如果编写一个类而没有包含构造函数,这个类仍能编译并且完全可以正常使用。如果类没有提供显式的构造函数,编译器会提供一个默认的构造函 数给你。除了创建对象本身,默认构造函数的唯一工作就是调用其超类的构造函数。在很多情况下,这个超类是语言框架的一部分,如java中的 Object类,objective-c 中的NSObject类。
不论是何种情况,在类中至少包含一个构造函数是一种很好的编程实践,如果类中有属性,好的实践往往是初始化这些属性。
——以上摘自《The Object-Oriented Thought Process》 by Matt Weisfeld

posted @ 2015-12-28 15:30  Bo-tree  阅读(88)  评论(0)    收藏  举报