写工厂方法时[[self alloc] init]的使用
The use of [[self alloc] init] when writing factory methods
我在编写工厂方法时无法理解 [[self alloc] init]
的用法。我知道工厂方法是创建 class 实例的便捷方法,它们会为您执行 alloc
、init
和 autorelease
。我可以看到这是如何形成的,例如在 NSArray
属性 的声明中使用工厂方法 arrayWithArray:
或 array
等调用它来设置它向上。
我可以清楚地看到这与对 alloc
和 init
.
的直接(显式)调用有何不同
我的问题是我不了解更深层次的工厂方法。我在网上看到一个解释说,与其显式调用 alloc
和 init
,不如使用 class 工厂方法来基本上封装如下内容:
+(instancetype)createWithString:(NSString *)string
{
return [[self alloc] initWithString:string];
}
但是 instancetype
和 [self alloc]
如何有效地允许子 class 使用 class 工厂方法?
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 *
)。
当class收到消息时,self
指向Class
对象。所以调用[Baseclass createWithString:]
时,self
会指向Baseclass
对象。但是,当调用 [Subclass createWithString:
] 时,self
将指向 Subclass
,因此如果 Subclass
定义了自己的 alloc
或 initWithString:
方法(即是,它会覆盖它们)它的版本将被调用。
我在编写工厂方法时无法理解 [[self alloc] init]
的用法。我知道工厂方法是创建 class 实例的便捷方法,它们会为您执行 alloc
、init
和 autorelease
。我可以看到这是如何形成的,例如在 NSArray
属性 的声明中使用工厂方法 arrayWithArray:
或 array
等调用它来设置它向上。
我可以清楚地看到这与对 alloc
和 init
.
我的问题是我不了解更深层次的工厂方法。我在网上看到一个解释说,与其显式调用 alloc
和 init
,不如使用 class 工厂方法来基本上封装如下内容:
+(instancetype)createWithString:(NSString *)string
{
return [[self alloc] initWithString:string];
}
但是 instancetype
和 [self alloc]
如何有效地允许子 class 使用 class 工厂方法?
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 *
)。当class收到消息时,
self
指向Class
对象。所以调用[Baseclass createWithString:]
时,self
会指向Baseclass
对象。但是,当调用[Subclass createWithString:
] 时,self
将指向Subclass
,因此如果Subclass
定义了自己的alloc
或initWithString:
方法(即是,它会覆盖它们)它的版本将被调用。