我处于必须init
使用参数创建的情况。
- (id) initWithSomeParameter:(id)parameter;
init
不应调用Normal 。所以,我有两个选择来完成这个。当有人调用init
or return时,我实际上可以抛出异常nil
。
应该做什么,为什么?
我处于必须init
使用参数创建的情况。
- (id) initWithSomeParameter:(id)parameter;
init
不应调用Normal 。所以,我有两个选择来完成这个。当有人调用init
or return时,我实际上可以抛出异常nil
。
应该做什么,为什么?
您应该有一个指定的初始化程序,所有其他init
方法都会调用它。
在您的示例中,指定的初始化程序可能是
- (id)initWithSomeParameter:(id)something;
如果另一个程序员调用-(id)init
而不是指定的初始化程序,您可能会执行以下操作:
- (id)init
{
return [self initWithSomeParameter:nil];
}
如果您绝对必须为 提供一个值someParameter
,那么您可以选择引发异常,但这种做法会随着实例对象初始化时获取值的重要性而有所不同。
以下是 Apple 关于使用指定初始化程序的意见:
在不了解您的用例的情况下很难说。但是,也许您对 API 过于严格。
UIKit
本身充满了需要一些数据来操作的类,但在初始化时不需要它。举个UIImageView
例子。你可能会认为“一个图像视图需要一个图像来做任何事情,因此我应该在初始化时需要一个图像!”。然而,这里的这个片段是一个完全有效的用例:
UIImageView *foo = [[UINavigationController alloc] init];
foo.image = [UIImage imageNamed:@"bar"];
在这里,我们创建一个图像视图,并在第二步中分配图像本身。因此,当您尝试以需要数据的方式使用对象时,如果该数据不存在,则会引发异常。
此外,您指定的初始化程序通常是通常采用最多参数的初始化程序,其余的则调用该初始化程序。像这样的东西可能是你想要的更多。
- (id)init {
// call this class's designated initializer
return [self initWithSomething:nil];
}
// this class's designated initializer
- (id)initWithSomething:(NSString*)something {
self = [super init]; // call superclass's designated initializer
if (self) {
// this class's setup code goes here, saving any arguments
somethingInstanceVar = something;
}
return self;
}
// some other method.
- (NSString*)doSomething {
if (somethingInstanceVar) {
// all is well, do stuff
return somethingInstanceVar;
} else {
// never got a "something" raise an exception
[NSException raise:@"Missing data" format:@"Something is required!"];
}
}