1

[[self alloc] init] 在编写工厂方法时无法理解其用法。我知道工厂方法是创建类实例的便捷方法,它们为您执行allocinitautorelease。我可以看到它是如何形成的,例如在NSArray使用工厂方法arrayWithArray:array等声明属性时调用它来设置它。我显然可以看出这与直接(显式)调用allocand有何不同init

我的问题是我不了解更深层次的工厂方法。我在网上看到了一个解释,它说可以使用类工厂方法来基本上封装这样的东西,而不是显式调用alloc和调用:init

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

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

4

1 回答 1

5
  1. instancetype是一个关键字,表示“此方法的返回类型是调用此方法的类的类型”(或子类)。因此,如果您调用[Baseclass createWithString:],则返回类型为Baseclass *。但是,假设您创建了一个覆盖此方法的子类。如果调用[Subclass createWithString:],则返回类型为Subclass *(not Baseclass *)。

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

于 2015-02-24T20:06:53.987 回答