0

众所周知,工厂方法不能调用实例方法。为什么下面的代码有效?

// .m file implementation DemoClass
// custom instance init method
- (instancetype)initWithDate:(NSDate *)date {
    if (self = [super init]) {
        self.lastTime = date;
    }
    return self;
}
// custom factory method
+ (instancetype)DemoClassWithDate:(NSDate *)date
    //here calling instance method initWithDate:
    return [[self alloc] initWithDate:date];
}
4

2 回答 2

3

[self alloc] 将返回一个实例。initWithDate 只是一个实例方法。没有理由不允许类方法在实例上调用实例方法。

PS。我强烈建议您检查您的编译器设置,并告诉编译器如果 '=' 的结果用作布尔值,则向您发出警告。这将防止许多难以发现的错误。您必须将 if 更改为

if ((self = [super init]) != nil)
于 2016-01-11T14:54:43.810 回答
2

因为它引用了新创建的实例:

return [[self alloc] initWithDate:date];
//      ^^^^^^^^^^^^
//       reference
于 2016-01-11T14:54:53.800 回答