是否有任何理由通过类方法实例化对象,而不是语法?

时间:2015-09-17 19:49:42

标签: objective-c cocoa instantiation nib

我一直在修复一个错误并在一些非常古老的代码中结束,我找到了一些我不太了解的东西

我们目前正在初始化这样的对象:

MyViewController* myViewController = [MyViewController viewControllerForDocument:(MyDocument*)doc];

+viewControllerForDocument是一种类方法:

+ (instancetype)viewControllerForDocument:(MyDocument*)myDocument
{
   MyViewController* result = nil;
   result = [[MyViewController alloc] initWithNibName:@"MyViewController"
                                                        bundle:[NSBundle mainBundle]];

   if ( result )
   {
      [result view];
      [result.myController setDocument:myDocument];
      [myDocument setController:result.myController];
   }
   return result;
}

我知道它看起来很有趣,但我的问题是为什么开发人员会选择通过类方法实例化对象 - 而不仅仅是编写自定义实例初始化程序?无论如何,类方法的实现都包含实例初始化器-initWithNibName

现在出现问题的原因是因为[result view]加载了调用-awakeFromNib的笔尖。

-awakeFromNib需要了解myDocument;但由于初始化程序是一个类方法,我无法将myDocument存储到实例属性中。

我也无法在[result.myController setDocument:myDocument];调用之前移动[result view],因为myController是通过nib加载的。

无论如何,这一切对我来说都很糟糕,事实上它是由一位早已消失的员工于2010年撰写的,这让我持怀疑态度。

有人能否说明以这种方式实施的可能动机?我也不认为通过访问view手动通过笔尖加载对象也不错,但我没有任何理由说它不好

1 个答案:

答案 0 :(得分:2)

NSString类方法中的以下内容有何不同:

+ (instancetype)stringWithUTF8String:(const char *)bytes

两者都是类方法,有时称为便利初始化器。

在ARC之前它们更有用,它们避开了alloc init autorelease模式:

MyClass *inst = [[[MyClass aloc] init] autorelease];