静态方法和良好的设计

时间:2013-01-26 22:12:32

标签: objective-c oop objective-c-category

我已经看到了一种初始化视图控制器的方法,这种方式引起了我的兴趣。可能是我缺乏经验,但我发现它非常有用,但是,我试图看看是否有任何原因应该避免它,所以我知道我是否应该采用它。

UIViewController* imageC = [UIViewController imageViewController];

imageViewController是一个类别中的静态方法:

+(UIViewController*) imageViewController
{
    return [[UIViewController alloc] initWithNibName:@"ImageViewController" bundle:nil];
}

这是一个好的,可靠的设计吗?我是这么认为的,但不确定。作为静态方法意味着它缺乏上下文,但不确定在这种情况下是否存在问题。 如果您使用此方法,您可以长期运行哪些问题?(如果有的话)

2 个答案:

答案 0 :(得分:2)

  UIViewController* imageC = [UIViewController imageViewController];

这被称为便利构造函数工厂方法,完全合法且有用。顺便说一句,它是一种类方法,而不是静态方法。

便利构造函数有两个主要特征:

  1. 它提供了一种更方便的语法,可以通过标准的alloc / init实例化一个类;

  2. 它返回一个autorelease对象,该对象将在当前作用域的末尾或当前自动释放池的末尾解除分配。

  3.   

    到目前为止,你可能已经在类文档中注意到大多数Cocoa类都有一组以格式+ className命名的类方法。这些特殊的类方法被称为“便捷构造函数”,用于创建临时对象。临时的意思是方便构造函数返回的对象被假定为自动释放[...]。

    source

    编辑:关于便利构造函数机制的更多细节(以及一般关于返回引用)可以在Objective C ARC Reference, sec. 3.2.2中找到。

答案 1 :(得分:2)

您的代码存在一些问题。首先,Objective C中没有静态方法。有类方法,它们和实例方法一样,做动态调度。他们只是使用类对象。

这引出了我们第二个问题:即使在子类上调用时,您的代码也始终会分配UIViewController的实例。这不是Objective-C的预期行为。 [NSMutableArray array]返回一个可变数组,即使arrayNSArray中定义的便捷构造函数。

第三个问题是次要的:如果你声明你的方法返回instancetype,对子类的用户是有益的。这样你就说这个方法返回一个接收器类的实例,编译器可以进行静态类型检查。这个概念被称为related return type,最近才与clang一起推出。

这是一个更好的版本:

+ (instancetype)imageViewController
{
    return [[self alloc] initWithNibName:@"ImageViewController" bundle:nil];
}