gpt4 book ai didi

objective-c - 除了语法之外,还有什么理由通过类方法实例化对象吗?

转载 作者:行者123 更新时间:2023-12-03 17:02:02 29 4
gpt4 key购买 nike

我一直在修复一个错误并陷入一些相当旧的代码中,并且我发现了一些我不完全理解的东西

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

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

现在这是一个问题,因为[结果 View ]加载了调用-awakeFromNib的 Nib 。

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

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

无论如何,这整件事让我觉得很臭,事实上它是由一位早已去世的员工在 2010 年写的,这一事实让我对此表示怀疑。

任何人都可以阐明以这种方式实现事情的可能动机吗?我也不认为通过访问 view 通过 Nib 手动加载对象也不好,但我真的没有任何理由说它不好

最佳答案

这与以下 NSString 类方法有何特别不同:

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

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

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

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

关于objective-c - 除了语法之外,还有什么理由通过类方法实例化对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32638821/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com