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

时间:2015-02-24 19:34:57

标签: objective-c class inheritance factory-method

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

我的问题是我不能更深入地了解工厂方法。我在网上遇到一个解释说明了一个类工厂方法可以用来基本上封装这样的东西:

alloc

但是init+(instancetype)createWithString:(NSString *)string { return [[self alloc] initWithString:string]; } 如何有效地允许子类使用类工厂方法?

1 个答案:

答案 0 :(得分:5)

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

  2. 当班级收到讯息时,self指向Class个对象。因此,在致电[Baseclass createWithString:]时,self将指向Baseclass对象。但是,在调用[Subclass createWithString:]时,self会指向Subclass,因此如果Subclass定义了自己的allocinitWithString:方法(是,它会覆盖它们)将调用它的版本。