0

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

第一个是分数类

 -(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;
}

为什么第一个需要在第一个方法中分配和初始化 *result 实例变量而不是第二个?是因为它调用了另一个方法 [result reduce] 还是因为它返回了一个值?或者是其他东西?第二种方法似乎只是简单地实例化 Fraction 类型的临时变量结果,而无需初始化或创建内存。

谢谢

4

2 回答 2

4

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

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

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

因此,在第二种情况下,您不需要分配 init 分数,因为您没有尝试创建新的空分数,而是从其他地方获取指向分数的指针(本例中的 -add 方法)并使用它。

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

于 2012-12-01T20:13:16.750 回答
1

您已经在方法中alloc吃掉并initialize 对象并返回指向它的指针。然后将此指针分配给一个局部变量——您不需要为它分配更多内存。

另外,如果您不使用 ARC,请不要忘记在您的autorelease方法中,或者在使用它后的方法中。否则你的应用程序会泄漏内存。result-dividerelease-performOperation

于 2012-12-01T20:15:30.447 回答