init

(id)init {
// 先讓父類別進行初始化
  if (self = [super init]) {
// do something
}
return self;
}


if(self=[super init]) 首先的是[super init],使超类完成自己的初始化工作
if(self=[super  init])这条语句的意思,[super  init]是初始化父类中的变量方法,self=[super  init]就相当于子类也初始化了这些变量和方法,而用if判断下,是为了防止self为空的情况,即创建失败的情况。
self被指定为返回值,这个返回值通过self =[super  init]中发送给super对象的init消息得来。
它只意味着在Object-C中我们必须手工调用父类得init方法。没有对父类的自动调用。我们必须指定self为[super  init]的返回值,因为它可能会返回nil。(非常重要的语法知识)
Objective-C创建对象需通过两个消息:alloc以及init。alloc的作用是分派存储器空间,init则是对对象做初始化。init与alloc都是定义在NSObject里的类方法,当对象收到这两个消息并做出正确回应后,新实体才算准备妥当。


特别注意:在Objective-c中,这句话中,if(self=[super init])为什么不用“==”而用"="
这里不是判断self与[super init]是否相等,而是判断是否可以成功初始化。
[super init]:父类初始化成功的话,通过=给self,这样self成为一个非空对象,整个来说即非false(非NO)。
于是也就变成了:
if ( !false )
{
   //成功初始化后执行的代码

如果init失败 self则为空 if条件为假,于是if段内语句不执行


父类进行初始化时,用的是子类对象指针self,父类的init方法有可能对这个指针指向的内存区作了大的变更(有可能把这个指针所指的内存释放了,
重新分配了另一块内存区域返回来,这时这个返回的指针与原来的指针是指向不同地址的),所以父类初始化后要重新返回指针。
父类返回的和子类的
self的类型都为id类型(通用类型)。父类的init方法若返回的指针与self不一样,
在父类的
init方法中已作了release和新的内存分配,不需要自己再去release sef,直接用父类init方法返回的指针就可以了。

posted @ 2012-02-17 15:52  Piosa  阅读(2046)  评论(1编辑  收藏  举报