在Objective-C中,当initWith返回(Fraction *)和init返回(id)时,它会有什么不同?

时间:2012-04-23 01:45:57

标签: objective-c

在Stephen Kochan的Objective-C一书(我有第3版)中,一个init函数返回Fraction *,一个返回id

-(Fraction *) initWith: (int) n: (int) d {
    self = [super init];
    if (self)
        [self setTo: n over: d];

    return self;
}

-(id) init {
    return [self initWith: 0 over: 0];
}

(见本书第198至199页)。为什么会这样,如果两者都返回Fraction *或两者都返回id(或让init返回Fraction *initWith返回id,这是否重要? )?这样做会产生什么副作用?

2 个答案:

答案 0 :(得分:1)

Init方法通常返回id类型,因为它们不一定返回它们所属类的对象。

例如,-[NSMutableArray init]实际上返回了一个NSCFMutableArray对象。

答案 1 :(得分:1)

赞成从初始化程序返回id

您可以使用其他语法,但在实践中它非常嘈杂(除非您从未进行过子类化并保证选择器是唯一的。)

便捷构造函数很好,但最安全的是将类型名称添加到构造函数中:

+ (Fraction *)newFractionWithNumerator:(int)pNumerator denominator:(int)pDenominator;

如果没有这些措施,您的程序将会遇到几个编译器警告和错误。