在方法内部分配init

时间:2012-12-01 20:02:19

标签: objective-c ios

我在同一个应用程序中有两个方法

第一个是分数类

 -(Fraction *) divide: (Fraction *) f
 {
 Fraction *result = [[Fraction alloc] init];
 result.numerator = numerator * f.denominator
 [result reduce];
 return result;
 }

第二个是计算器类

-(Fraction *) performOperation: (char) op
   {
 Fraction *result;
 switch (op) {
 case '+':
 result = [operand1 add: operand2];
 break;
 .
 .
 .
 .
 etc

break;
}
accumulator.numerator = result.numerator;
accumulator.denominator = result.denominator;
return accumulator;
}

为什么第一个需要分配和初始化*结果实例变量 在第一种方法但不是第二种方法?是因为它正在调用另一种方法  [结果减少]还是因为它返回一个值?或者是其他东西? 第二种方法似乎只是实例化Fraction类型的临时变量结果 没有初始化或创建内存。

由于

2 个答案:

答案 0 :(得分:4)

你的困惑源于一种不准确的思考正在发生的事情的方式。如果以这种方式考虑它会更清楚:

而不是“分配初始化结果变量”,你正在做的是“分配初始化分数对象,然后将其地址分配给结果变量”。

对象的创建与将其地址分配给变量是分开的,并且对象与变量不同,变量只是引用它。

所以在第二种情况下,你不需要分配init一个Fraction,因为你没有尝试创建一个新的空Fraction,你从其他地方得到一个指向Fraction的指针(-add方法in这种情况)并使用它。

此外,您的-divide方法看起来不正确。你永远不会在你的新分数上设置分母。

答案 1 :(得分:1)

您已经alloc吃了init ialize方法中的对象并返回指向它的指针。然后将此指针指定给局部变量 - 您不需要为其分配更多内存。

此外,如果您不使用ARC,请不要忘记在autorelease方法中result -divide或在release方法中忘记-performOperation使用它后的{1}}方法。否则你的应用程序将泄漏内存。