使用obj-c中的参数初始化

时间:2013-02-26 01:37:32

标签: ios objective-c cocoa-touch

我处于需要使用参数创建init的情况。

- (id) initWithSomeParameter:(id)parameter;

不应调用普通init。所以,我有两个选择来实现这一目标。当某人调用init或返回nil时,我实际上可以抛出异常。

应该做什么以及为什么?

2 个答案:

答案 0 :(得分: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

答案 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!"];
  }
}