我已经看到了一种初始化视图控制器的方法,这种方式引起了我的兴趣。可能是我缺乏经验,但我发现它非常有用,但是,我试图看看是否有任何原因应该避免它,所以我知道我是否应该采用它。
UIViewController* imageC = [UIViewController imageViewController];
imageViewController
是一个类别中的静态方法:
+(UIViewController*) imageViewController
{
return [[UIViewController alloc] initWithNibName:@"ImageViewController" bundle:nil];
}
这是一个好的,可靠的设计吗?我是这么认为的,但不确定。作为静态方法意味着它缺乏上下文,但不确定在这种情况下是否存在问题。 如果您使用此方法,您可以长期运行哪些问题?(如果有的话)
答案 0 :(得分:2)
UIViewController* imageC = [UIViewController imageViewController];
这被称为便利构造函数或工厂方法,完全合法且有用。顺便说一句,它是一种类方法,而不是静态方法。
便利构造函数有两个主要特征:
它提供了一种更方便的语法,可以通过标准的alloc / init实例化一个类;
它返回一个autorelease
对象,该对象将在当前作用域的末尾或当前自动释放池的末尾解除分配。
到目前为止,你可能已经在类文档中注意到大多数Cocoa类都有一组以格式+ className命名的类方法。这些特殊的类方法被称为“便捷构造函数”,用于创建临时对象。临时的意思是方便构造函数返回的对象被假定为自动释放[...]。
(source)
编辑:关于便利构造函数机制的更多细节(以及一般关于返回引用)可以在Objective C ARC Reference, sec. 3.2.2中找到。
答案 1 :(得分:2)
您的代码存在一些问题。首先,Objective C中没有静态方法。有类方法,它们和实例方法一样,做动态调度。他们只是使用类对象。
这引出了我们第二个问题:即使在子类上调用时,您的代码也始终会分配UIViewController
的实例。这不是Objective-C的预期行为。 [NSMutableArray array]
返回一个可变数组,即使array
是NSArray
中定义的便捷构造函数。
第三个问题是次要的:如果你声明你的方法返回instancetype
,对子类的用户是有益的。这样你就说这个方法返回一个接收器类的实例,编译器可以进行静态类型检查。这个概念被称为related return type
,最近才与clang一起推出。
这是一个更好的版本:
+ (instancetype)imageViewController
{
return [[self alloc] initWithNibName:@"ImageViewController" bundle:nil];
}