为什么工厂方法可以调用实例方法?

时间:2016-01-11 14:51:31

标签: objective-c factory-method instance-method

众所周知,工厂方法无法调用实例方法。为什么以下代码有效?

// .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];
}

2 个答案:

答案 0 :(得分:3)

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

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

if ((self = [super init]) != nil)

答案 1 :(得分:2)

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

return [[self alloc] initWithDate:date];
//      ^^^^^^^^^^^^
//       reference