【问题标题】:Leaking Method in Objective CObjective C 中的泄漏方法
【发布时间】:2011-05-26 06:02:28
【问题描述】:

我正在阅读 Stephen Kochan 的 Objective-C 编程(我承认我是一个完全的初学者)。

我目前的程序是一个分数计算器。我有加法、减法、乘法和除法方法。 Instruments 告诉我它们都在泄漏(只有一点点,但它是一个小程序。)

下面是减法的定义(其余的形式非常相似):

-(Fraction *)   subtract: (Fraction *) f;
{
    Fraction    *result = [[Fraction alloc] init];
    int         resultNum, resultDenom;

    resultNum = numerator * f.denominator - f.numerator * denominator;
    resultDenom = denominator * f.denominator;

    [result setTo: resultNum over: resultDenom];

    return result;
    [result release];
}

想堵住漏洞?提前谢谢。

此外,我在网站上四处寻找其他解释,但遗憾的是,我认为没有其他人提出过如此基本的问题。

【问题讨论】:

  • Cocoa 约定规定,任何返回已分配但未释放/自动释放的对象的方法必须具有以newcreate 开头的名称。否则,如果它返回一个对象,根据 Bavarious 的回答,它应该是 autoreleased。

标签: objective-c methods memory-leaks


【解决方案1】:

问题在于:

return result;
[result release];

-release 永远不会发送到result,因为return 之后的任何语句都不会执行。此类语句称为死代码。

你应该自动释放你的对象,例如:

return [result autorelease];

请注意,您应该使用-autorelease 而不是-release,因为-release 会导致立即释放result,这不是您想要的。另一方面,自动释放的对象会在未来的某个时间点被释放——特别是在相应的自动释放池耗尽时。

【讨论】:

  • 并回答明显的后续“嗯,相应的自动释放池何时耗尽?”:在大多数情况下,这将是 AppKit/UIKit 框架创建的顶级自动释放池在每次运行开始时通过事件循环并在结束时排出。
  • @Chuck、@Bavarious、@Shaggy Frog 感谢您提供的帮助以及有关 release v. autorelease 和一般编程约定的额外信息。我现在要试一试。 (此外,我对这个网站上的回复印象深刻,期待有一天我可以真正做出贡献而不仅仅是水蛭。)
【解决方案2】:

替换:

return result;
[result release];

与:

return [result autorelease];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    相关资源
    最近更新 更多