我处于需要使用参数创建init
的情况。
- (id) initWithSomeParameter:(id)parameter;
不应调用普通init
。所以,我有两个选择来实现这一目标。当某人调用init
或返回nil
时,我实际上可以抛出异常。
应该做什么以及为什么?
答案 0 :(得分:4)
您应该有一个指定的初始化程序,其他所有init
方法都会调用。
在您的示例中,指定的初始化程序可能是
- (id)initWithSomeParameter:(id)something;
如果其他程序员调用-(id)init
而不是指定的初始化程序,您可能会执行以下操作:
- (id)init
{
return [self initWithSomeParameter:nil];
}
如果您绝对必须为someParameter
提供了值,则可以选择提出异常,但这种做法会因初始化值的重要性而异。实例对象。
这也是Apple对使用指定初始化程序的输入:
答案 1 :(得分:4)
如果不了解您的用例,很难说。但是,也许您对API过于严格。
UIKit
本身充满了需要一些数据才能运行的类,但在init上不需要它。以UIImageView
为例。您可能认为“图像视图需要图像进行任何操作,因此我应该在init上需要图像”。但是,这里的代码片段是完全有效的用例:
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!"];
}
}