今天在学习Objective-C时见到某初始化函数中有如下代码:
// Initialize members
return nil;
return self;
if ((self = [super init]) == nil)
[...initialize my stuff...]
return self;
if (![super init])
[...initialize my stuff...]
return self;
return nil;
if(!(self = [super init]))
{
}
// Initialize members
return self;
There's been hints from Apple that they might modify the standard -[NSObject init] method to try to re-use old object's memory, since it turns out that a very common usage pattern is for programs to keep creating and deallocating, say, 12 objects of the same class, over and over. Re-using the exact same memory ends up being a big win (and this is a trick the iPhone already does with its UITableViewCell class, and that is a HUGE win if you do it yourself on the iPhone).
So, from now on, I recommend everyone uses:
Subclassing NSColorPanel the Right Way
- (id)init;
{
}
I do.
小弟最近iPhone,感到 Objective C上的一些疑,希望各高手能指一下。
............
- (id)init {
// 先父行初始化
if (self = [super init]) {
// do something
}
return self;
}
............
[[MyClass alloc] init];
............
上述是分配空然後行初始化,用父的初始化可以理解。
要返回 self ,甚要做?有父所返回的型跟子是不一的。
有在入 init 之前,self 本身指向 alloc 所予的空,我不需要先 release 它?
就像:
........
newSelf = [super init];
if (self != newSelf){
[self release];
self = newSelf;
}
return self;
...........
父类进行初始化时,用的是子类对象指针self,父类的init方法有可能对这个指针指向的内存区作了大的变更(有可能把这个指针所指的内存释放了,重新分配了另一块内存区域返回来,这时这个返回的指针与原来的指针是指向不同地址的),所以父类初始化后要重新返回指针。父类返回的和子类的self的类型都为id类型(通用类型)。父类的init方法若返回的指针与self不一样,在父类的init方法中已作了release和新的内存分配,不需要自己再去release sef,直接用父类init方法返回的指针就可以了。
self被指定为返回值,这个返回值通过self = [super init]中发送给super对象的init消息得来,如果你有C++背景,看到这个一定会痛苦得打哆嗦。不要太心烦,没关系的。它只意味着在Object-C中我们必须手工调用父类得init方法。没有对父类的自动调用。我们必须指定self为[super init]的返回值,因为它可能会返回nil。
Objective-C创建对象需通过两个消息:alloc以及init。alloc的作用是分派存储器空间,init则是对对象做初始化。 init与alloc都是定义在NSObject里的类方法,当对象收到这两个消息并做出正确回应后,新实体才算准备妥当。以下即为示例:
MyObject * my = [[MyObject alloc] init];
在Objective-C 2.0里,可以简化为单独一个消息new
MyObject * my = [MyObject new];
这仅仅是语法上的精简,效用完全相同。 若要自己定义初始化的过程,可以复写init方法,来添加额外的工作。(功用类似C++的constructor)
- (id) init { if ( self=[super init] ){ // 必須呼叫父類的init // do something here ... } return self; }
objc的对象初始化包括两步
1. 分配内存[ClassName alloc],alloc方法继承自NSObject,分配内存,并清空置0.
2. 初始化[Object init], 返回对象实例; 注意init方法有可能返回的是跟alloc取得的不同的对象. init 是个普通的方法,类可以有多个初始化方法.
}
object