我一直在修复一个错误并在一些非常古老的代码中结束,我找到了一些我不太了解的东西
我们目前正在初始化这样的对象:
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
手动通过笔尖加载对象也不错,但我没有任何理由说它不好
答案 0 :(得分:2)
与NSString
类方法中的以下内容有何不同:
+ (instancetype)stringWithUTF8String:(const char *)bytes
两者都是类方法,有时称为便利初始化器。
在ARC之前它们更有用,它们避开了alloc
init
autorelease
模式:
MyClass *inst = [[[MyClass aloc] init] autorelease];