如何编写Objective-C便利构造函数

Chr*_*ker 19 objective-c

我正在尝试向我的自定义对象添加一个便利构造函数.相近[NSArray arrayWithArray:]

我知道它涉及一个返回自动释放对象的类方法.我一直在谷歌搜索,但我似乎找到的只是一个方便构造函数的定义,但不是如何写一个.

Jon*_*pan 33

假设您有以下内容:

@class PotatoPeeler : NSObject
- (instancetype)initWithWidget: (Widget *)w;
@end
Run Code Online (Sandbox Code Playgroud)

然后要添加工厂方法,您可以将其更改为:

@class PotatoPeeler : NSObject
+ (instancetype)potatoPeelerWithWidget: (Widget *)w;
- (instancetype)initWithWidget: (Widget *)w;
@end
Run Code Online (Sandbox Code Playgroud)

你的实现只是:

+ (instancetype)potatoPeelerWithWidget: (Widget *)w {
    return [[[self alloc] initWithWidget: w] autorelease];
}
Run Code Online (Sandbox Code Playgroud)

编辑:替换idinstancetype.它们在功能上是相同的,但后者为编译器提供了有关方法返回类型的更好提示.

  • +1注意使用`self`而不是硬编码的类名来alloc-init实例以便**正确处理子类**(`self` here指的是类对象本身).还要注意返回类型`id`:["方便构造函数的返回类型是id,原因与初始化方法的id相同"](http://developer.apple.com/library/mac/documentation/Cocoa/概念/的ObjectiveC /章节/ ocAllocInit.html#// apple_ref/DOC/UID/TP30001163-CH22-SW12) (12认同)
  • 假设你有一个子类,'SweetPotatoPeeler`.如果使用`+ [self alloc]`,那么方便方法将正确返回`SweetPotatoPeeler`的实例,而不是'PotatoPeeler`.如果使用`+ [PotatoPeeler alloc]`,该方法将始终为您提供基类的实例,并且子类将无法利用它. (3认同)
  • @albertamg你能详细说明为什么`[self alloc]`被用在`[PotatoPeeler alloc]`上?通过正确处理子类化不确定你的意思... thx (2认同)