2

我处于必须init使用参数创建的情况。

- (id) initWithSomeParameter:(id)parameter;

init不应调用Normal 。所以,我有两个选择来完成这个。当有人调用initor return时,我实际上可以抛出异常nil

应该做什么,为什么?

4

2 回答 2

4

您应该有一个指定的初始化程序,所有其他init方法都会调用它。

在您的示例中,指定的初始化程序可能是

- (id)initWithSomeParameter:(id)something;

如果另一个程序员调用-(id)init而不是指定的初始化程序,您可能会执行以下操作:

- (id)init
{
    return [self initWithSomeParameter:nil];
}

如果您绝对必须为 提供一个值someParameter,那么您可以选择引发异常,但这种做法会随着实例对象初始化时获取值的重要性而有所不同。

以下是 Apple 关于使用指定初始化程序的意见:

http://developer.apple.com/library/ios/#documentation/general/conceptual/DevPedia-CocoaCore/MultipleInitializers.html

于 2013-02-26T01:46:38.250 回答
4

在不了解您的用例的情况下很难说。但是,也许您对 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!"];
  }
}
于 2013-02-26T01:53:35.590 回答