1

我看到了一种初始化视图控制器的方法,这让我很感兴趣。可能是我缺乏经验,但我觉得它非常有用,但是,我试图看看是否有任何理由应该避免它,所以我知道我是否也应该采用它。

UIViewController* imageC = [UIViewController imageViewController];

imageViewController类别中的静态方法在哪里:

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

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

4

2 回答 2

2
  UIViewController* imageC = [UIViewController imageViewController];

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

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

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

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

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

来源

编辑:有关便利构造函数机制的更多详细信息(以及一般关于返回引用)可以在Objective C ARC 参考中找到,秒。3.2.2 .

于 2013-01-26T22:13:39.133 回答
2

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

这就引出了第二个问题:您的代码总是分配 的实例UIViewController,即使在子类上调用时也是如此。这不是 Objective-C 的预期行为。[NSMutableArray array]返回一个可变数组,即使array是在NSArray.

第三个问题是次要的:如果您将方法声明为 return ,对子类的用户将是有益的instancetype。这样,您所说的方法返回接收器类的实例,编译器可以进行静态类型检查。这个概念被称为related return type并且最近才在 clang 中引入。

这是一个更好的版本:

+ (instancetype)imageViewController
{
    return [[self alloc] initWithNibName:@"ImageViewController" bundle:nil];
}
于 2013-01-26T22:44:12.223 回答