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

che*_*ead 1 inheritance class objective-c factory-method

我在理解[[self alloc] init] 编写工厂方法的过程中遇到了麻烦.据我所知,工厂方法方便的方法来创建一个类的实例,而且他们做的alloc,initautorelease你.我可以看到它是如何形成的,例如在NSArray使用工厂方法声明属性时arrayWithArray:,或者array等等要求它进行设置.我可以清楚地看到这与对allocand 的彻底(显式)调用有何不同init.

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

+(instancetype)createWithString:(NSString *)string
{
    return [[self alloc] initWithString:string];
}
Run Code Online (Sandbox Code Playgroud)

但是,如何instancetype[self alloc]有效地让子类要利用类工厂方法?

mip*_*adi 5

  1. instancetype是一个关键字,表示"此方法的返回类型是调用此方法的类的类型"(或子类).所以,如果你打电话[Baseclass createWithString:],返回类型是Baseclass *.但是,假设您创建了一个重写此方法的子类.如果你打电话[Subclass createWithString:],返回类型是Subclass *(不是Baseclass *).

  2. 当类接收消息时,self指向该Class对象.所以在调用时[Baseclass createWithString:],self会指向该Baseclass对象.但是,当调用[Subclass createWithString:]时,self将指向Subclass,所以如果Subclass定义它自己allocinitWithString:方法(也就是说,它会覆盖它们),则会调用它的版本.