初始化方法的实现
在Objective-C 中, 初始化方法的实现需要遵守比其它 种类方法更多的约束和规则:
自定义初始化方法的命名一般应以 “init” 开头
id
初始化方法的返回值类型必须是 id
在自定义初始化方法的实现中, 必须有对本类的定初始化方法的引用
指
初始化方法的实现 在实现中引用其它初始化方法时, 注意把返回值赋给 self
在对实例变量赋值时, 进行直接访问, 而不是透过 访问器 self , 如果初始化过程失败, 则返回 nil
下面是一个简单的对方法进行复写的例子:
- (id )init {
// Assign self to value returned by super's designated initializer // Designated initializer for NSObject is init
if (self = [super init]) {
creationDate = [[NSDate alloc] init];
return self ;
}
return nil ;
}
初始化方法不必对所有的变量都一一赋值
下面是使用一个传入参数来进行初始化的初始化方法的例子:
- ( id )initWithImage:(NSImage *)anImage { // Find the size for the new instance from the image
NSSize size = anImage.size;
NSRect frame = NSMakeRect(0.0 , 0.0 , size.width, size.height);
// Assign self to value returned by super's designated initializer
// Designated initializer for NSView is initWithFrame:
if (self = [super initWithFrame:frame]) {
image = [anImage retain];
return self ;
}
}
处理初始化失败
Handling Initialization Failure
通常情况下, 如果在初始化过程中发生任何异常, 则
应当调用 [self release]并返回 nil
使用这种机制会带来以下的两个关联结果:
任何收到 nil
作为返回值的对象都能够很好地对它进行处理, 但是如果它在那之前已经为新对象设置了外部连接关系, 则还需要对这些连接关系进行清理
对象的 dealloc
方法必须能保证能够处理初始化不完全的对象
通常应当在完成对先期初始化结果的检查后才进行外部连接 的建立:
- (id )init {
if (self = [super init]) {
creationDate = [[NSDate alloc] init];
return self ;
}
这个例子展示了初始化方法如何处理未正常传入的参数:
NSRect frame = NSMakeRect(0.0 ,0.0 , size.width, size.height);
- (id )initWithImage:(NSImage *)anImage {
//super's designated initializer
if (anImage == nil ) {
[self release];
return nil ;
}
// Designated initializer for NSViewis initWithFrame:
if (self = [super initWithFrame:frame]) {
image = [anImage retain];
// Find the size for the new instance from the image
NSSize size = anImage.size;
return self ;
}
}