我在同一个应用程序中有两个方法
第一个是分数类
-(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类型的临时变量结果 没有初始化或创建内存。
由于
答案 0 :(得分:4)
你的困惑源于一种不准确的思考正在发生的事情的方式。如果以这种方式考虑它会更清楚:
而不是“分配初始化结果变量”,你正在做的是“分配初始化分数对象,然后将其地址分配给结果变量”。
对象的创建与将其地址分配给变量是分开的,并且对象与变量不同,变量只是引用它。
所以在第二种情况下,你不需要分配init一个Fraction,因为你没有尝试创建一个新的空Fraction,你从其他地方得到一个指向Fraction的指针(-add方法in这种情况)并使用它。
此外,您的-divide方法看起来不正确。你永远不会在你的新分数上设置分母。
答案 1 :(得分:1)
您已经alloc
吃了init
ialize方法中的对象并返回指向它的指针。然后将此指针指定给局部变量 - 您不需要为其分配更多内存。
此外,如果您不使用ARC,请不要忘记在autorelease
方法中result
-divide
或在release
方法中忘记-performOperation
使用它后的{1}}方法。否则你的应用程序将泄漏内存。