【问题标题】:iOS: Memory LeakiOS:内存泄漏
【发布时间】:2012-02-18 21:39:13
【问题描述】:

在 Utilities 类中,我有以下方法:

+ (Division *) getNationalDivision
{
    Division *defaultDivision = [[[Division alloc] init] autorelease];
    defaultDivision.Id = 0;
    defaultDivision.name = @"National";

    return defaultDivision;
}

我在我的应用程序委托中分配了一个部门来存储整个应用程序中的部门,所以在我的一个视图控制器中我有:

appDel.currentDivision = [[Utilities getNationalDivision] retain];

在应用委托 .h 我有:

@property (nonatomic, retain) Division *currentDivision;

在应用委托 .m 中,我有:

currentDivision = [[Division alloc] init];

当我分析时,我得到指向上述行的对象的潜在泄漏。有任何想法吗?如果我不保留国家分部,那就行不通了。另外,请注意,一切正常。我只是想确保我没有泄露任何东西。

【问题讨论】:

  • 你是如何声明 currentDivision 的?
  • 您可能想要提及您的currentDivision 属性的定义。我想retain?在这种情况下,这里额外的retain 很可能是过度保留。我们将通过@property 定义了解更多信息。
  • 我添加了代码,我正在分配它

标签: ios memory memory-leaks


【解决方案1】:

检查您如何在应用委托中声明属性 currentDivision。如果它是assign(我想,因为您在通过属性分配之前保留它)那么您分配给它的原始值:

 currentDivision = [[Division alloc] init];

执行时不会得到released

 appDel.currentDivision = [[Utilities getNationalDivision] retain];

因此,您在应用程序委托中创建的对象将泄漏。手动发布并检查分析器是否一直在抱怨:

[app.currentDivision release];

这仅在您的属性被声明为 assign 时才有意义。

如果声明为retain,则故障在线:

 appDel.currentDivision = [[Utilities getNationalDivision] retain];

不应该手动保留的地方。

【讨论】:

    【解决方案2】:

    保留是通过综合属性访问器方法完成的。删除它。

    【讨论】:

    • 他说如果他删除保留它不起作用。所以它可能没有被保留为属性...@Jesse:请提供有关如何定义 currentDivision 属性的更多信息(或者它是局部变量...)
    • 如果你使用 [appDel setCurrentDivision:[Utilities getNationalDivision]];?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2016-10-16
    • 2014-06-06
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多