我在编写工厂方法时无法理解[[self alloc] init]
的用法。我知道工厂方法是创建类实例的便捷方法,并且它们为您执行alloc
,init
和autorelease
。我可以看到它是如何形成的,例如在声明NSArray
属性时使用工厂方法arrayWithArray:
,或array
等,并调用它来设置它。
我可以清楚地看到这与alloc
和init
的直接(显式)调用有何不同。
我的问题是我不能更深入地了解工厂方法。我在网上遇到一个解释说明了一个类工厂方法可以用来基本上封装这样的东西:
alloc
但是init
和+(instancetype)createWithString:(NSString *)string
{
return [[self alloc] initWithString:string];
}
如何有效地允许子类使用类工厂方法?
答案 0 :(得分:5)
instancetype
是一个关键字,表示"此方法的返回类型是此方法被调用的类的类型" (或子类)。因此,如果您致电[Baseclass createWithString:]
,则返回类型为Baseclass *
。但是,我们假设您创建了一个不覆盖此方法的子类。如果您致电[Subclass createWithString:]
,则返回类型为Subclass *
(不是Baseclass *
)。
当班级收到讯息时,self
指向Class
个对象。因此,在致电[Baseclass createWithString:]
时,self
将指向Baseclass
对象。但是,在调用[Subclass createWithString:
]时,self
会指向Subclass
,因此如果Subclass
定义了自己的alloc
或initWithString:
方法(是,它会覆盖它们)将调用它的版本。