标签:
首先说一下自己的理解。下面的这种代码,在类初始化的第一个方法中很常见
-(instancetype)initWithName:(NSString *)name{ self = [super init]; if(self){ bookName = [NSString stringWithString:name]; book = [NSMutablearray array]; } return self; }
一般情况下,在OC中定义一个类的时候,总要提供一个初始化方法,而一般的初始化方法的规则是
- (id) init { if(self = [super init]) { //为子类增加属性进行初始化 } return self; }
1. [super init]的作用:
面向对象的体现,先利用父类的init方法为子类实例的父类部分属性初始化。
2. self 为什么要赋值为[super init]:
简单来说是为了防止父类的初始化方法release掉了self指向的空间并重新alloc了一块空间。这时的话,[super init]可能alloc失败,这时就不再执行if中的语句。
3. super作为消息接受者的实质:
super并不是真正的指针,[super message]的实质是由self来接受父类的message。需要注意的是,[super message]中,message方法出现的self为[super message]语境中的self,即子类实例。
接下来有两个问题:
首先的第一个问题:为什么要调用父类的初始化方法呢?
首先,我们知道对象继承的概念,一个子类从父类继承,那么也要实现父类的所有功能,这就是is-a的关系,比如说狗是哺乳动物,那么狗必定具有哺乳动物的特征和功能。所以在子类的初始化方法中,必须首先调用父类的初始化方法,以实现父类相关资源的初始化。例如我们在初始化狗这一对象时,必须先初始化哺乳动物这一对象,并把结果赋予狗,以使狗满足属于哺乳动物这一特征。
典型的,在iOS下,所有的类都继承于NSObject,而NSObject的init方法很简单,就是return self。当父类的初始化完成之后,即self不为nil的情况下,就可以开始做子类的初始化了。
第二个问题是:是否一定要提供初始化方法?是否一定要用init作为初始化方法?
我们在oc中创建新的对象常用
MyClass *newclass = [[MyClass alloc] init]; //或者 MyClass *newclass = [Myclass new];
new方法是NSObject对象的一个静态方法,根据apple的文档,该方法实际上就是alloc和init方法的组合,实际上二者是一样的,但 apple还是推荐我们使用第一种方法,为什么呢?因为使用第一种方法,你可以使用自己定义的init方法来做一些初始化(用自己写的init*****方法),当然,如果子类没有提供 init方法,自然调用的就是父类的init方法了。所以说,从安全性的角度来收,作为开发者我们在对象使用之前是一定要对对象进行初始化的,因此在定义类的时候一定要提供初始化方法。但是否一定要使用init作为方法名呢?答案是不一定。使用init作为方法名只是你重写了NSObject的init方法而已,如果你自己重新定义一个初始化方法,也是完全可以的,只要你在使用的时候记得调用新定义的初始化方法就可以了。
但是,这种方法从设计角度来看我觉得是不可取的。在可复用性方面会比较差,如果确有必要定义一些接受不同参数的初始化方法,我的建议是,先定义一个init的公用方法,再到其他方法中调用它,如:
//init的公用方法 - (id)init { self = [super init]; if (self) { } return self; } - (id)initWithString:(NSString *)aString { [self init]; self.name = aString; } - (id)initWithImage:(UIImage *)aImage { [self init]; self.image = aImage; }
标签:
原文地址:http://www.cnblogs.com/superorangecc/p/5404021.html