写工厂方法时[[self alloc] init]的使用

The use of [[self alloc] init] when writing factory methods

我在编写工厂方法时无法理解 [[self alloc] init] 的用法。我知道工厂方法是创建 class 实例的便捷方法,它们会为您执行 allocinitautorelease。我可以看到这是如何形成的,例如在 NSArray 属性 的声明中使用工厂方法 arrayWithArray:array 等调用它来设置它向上。 我可以清楚地看到这与对 allocinit.

的直接(显式)调用有何不同

我的问题是我不了解更深层次的工厂方法。我在网上看到一个解释说,与其显式调用 allocinit,不如使用 class 工厂方法来基本上封装如下内容:

+(instancetype)createWithString:(NSString *)string
{
    return [[self alloc] initWithString:string];
}

但是 instancetype[self alloc] 如何有效地允许子 class 使用 class 工厂方法?

  1. instancetype 是表示 "the return type of this method is the type of the class that this method was called on"(或子class)的关键字。所以,如果你调用 [Baseclass createWithString:],return 类型是 Baseclass *。但是,假设您创建了一个 而不是 覆盖此方法的子class。如果调用 [Subclass createWithString:],return 类型是 Subclass *(不是 Baseclass *)。

  2. 当class收到消息时,self指向Class对象。所以调用[Baseclass createWithString:]时,self会指向Baseclass对象。但是,当调用 [Subclass createWithString:] 时,self 将指向 Subclass,因此如果 Subclass 定义了自己的 allocinitWithString: 方法(即是,它会覆盖它们)它的版本将被调用。