Objective-C类的通用初始化程序

时间:2014-02-27 16:55:34

标签: ios objective-c macos cocoa

我已经在Objective-C中编程多年了,我总是碰到这个问题:如果你有一个带有多个初始化器的对象,但是它们都有共同的代码,你如何将它解压出来?

我能想到的最好的是这样的:

@implementation Example

- (void)privateInitWithString:(NSString*)aString
{
  self.str = aString;
}

- (id)init
{
  self = [super initWithWindowNibName:@"MyNib"]
  if(self) {
    [self privateInitWithString:@""];
  }
  return self;
}

- (id)initWithString:(NSString*)aString
{
  self = [super initWithWindowNibName:@"MyNib"]
  if(self) {
    [self privateInitWithString:aString];
  }
  return self;
}

@end

代码闻到的各个初始化程序有很多重复。但是,我想不出一种方法可以让一个初始化程序“落到”另一个初始化程序,因为无法保证在调用self之前已设置[super init]

我缺少最佳做法吗?

1 个答案:

答案 0 :(得分:4)

您编写一个“指定的初始化程序”。初始化程序处理所有不同的情况。在你的情况下,initWithString似乎是一个很好的候选人。而init就变成了

- (instancetype)init { return [self initWithString:@""]; }

您可以在此处详细了解:

https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/Initialization/Initialization.html