【问题标题】:alloc init inside methodsalloc init 内部方法
【发布时间】:2012-11-19 17:38:33
【问题描述】:

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

第一个在分数类中

 -(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 实例变量 在第一种方法中,而不是第二种方法?是不是因为它正在调用另一个方法 [结果减少] 还是因为它返回了一个值?或者是其他东西? 第二种方法似乎只是简单地实例化 Fraction 类型的临时变量结果 无需初始化或创建内存。

谢谢

【问题讨论】:

  • 您的代码 sn-ps 不完整。操作数 1 和 2 以及累加器从何而来?
  • operand1 和 2 是计算器类中声明的属性
  • 我正在阅读一本书的教程,只是想弄清楚为什么有些 Fraction 对象是在方法内部创建的,而另一些是综合属性。为什么不将结果创建为属性?在本教程中,每个加法、减法、乘法和除法方法都会创建结果对象。为什么不在属性中只做一次?

标签: objective-c ios


【解决方案1】:

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

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

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

所以在第二种情况下,您不需要分配 init 分数,因为您不是要创建一个新的空分数,而是从其他地方获取指向分数的指针(-add 方法在这种情况下)并使用它。

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

【讨论】:

  • 好的,谢谢,我现在看到了不同之处。我删掉了一些代码,试图使它成为一个更简单的问题。示例中的逻辑不完整。
【解决方案2】:

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

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

【讨论】:

  • 这听起来不正确。如果没有 alloc 的方法在没有 alloc 的方法之前被调用怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多