【问题标题】:iOS - Problems with memory and retain/releaseiOS - 内存和保留/释放问题
【发布时间】:2012-12-06 16:16:36
【问题描述】:

我开发了一个应用程序,现在我正在使用 Instruments 来查看内存使用情况。我在理解对象的保留/释放过程时遇到问题。 Instruments 是这么说的:

当我将对象添加到数组中、将其添加到视图中以及从数组中取出时,保留计数会增加。 所以,当我使用removeFromSuperview 时,对象retainCount 永远不会为零,所以对象不会释放内存。

编辑 1: 我忘了说我正在使用 ARC。

编辑 2: 我准确地描述了发生的事情: 我在一个名为NKLevelGenerator 的类中将对象与其他对象一起创建。我将NKIngredients 分配到其中,然后将所有内容添加到将返回的NSArray。这里每个对象的保留计数是 2。在我的NKLevelVC,我的ViewController,我使用这个指令:

[level addObjectsFromArray:[levelGenerator level1WithDelegate:self ciotola:ciotola bagliore:bagliore difficulty:NKDifficultyHard]];

对象levelNSMutableArray,我在viewDidLoadallocinit。 从这里我调用另一个执行此操作的方法:

- (void)insertInArrayRandomly {
    for (int i=0; i<[level count]; i++) {
        [ingredienti insertObject:[level objectAtIndex:[[indexes objectAtIndex:i]integerValue]] atIndex:i];
    }
}

对象ingredienti 是我在viewDidLoad 中的allocinit 中的另一个NSMutableArrayindexesNSInteger 的数组,其中包含随机索引以随机提取 NKIngredient 对象。 然后我这样做:

NKIngredient *ing = [ingredienti objectAtIndex:index];
[[self view] insertSubview:ing belowSubview:navBar];
[ing animateIngredient];
[ingredienti removeObject:ing];

【问题讨论】:

标签: ios memory memory-management instruments


【解决方案1】:

首先:使用工具来查看是否存在内存泄漏,有一个为此目的而设计的工具,它会告诉您内存泄漏的位置。 第二:这取决于视图上有多少对象[保留]。如果你添加到一个数组,它会保留视图,但是如果你没有在创建视图的方法中释放它,当你从数组中释放视图时,计数仍然是1。

【讨论】:

    【解决方案2】:

    在研究 Instruments 之前,您是否尝试过对代码进行静态分析?它可能有助于解决简单的内存问题。

    但首先要检查的是:您是否遵循黄金法则

    黄金法则是:对于每个alloccopyretain,您必须使用一个,并且只能使用一个releaseautorelease

    这是没有 ARC 的内存管理最重要的规则。因此,您的对象被数组保留这一事实与您无关,只需记住您保留、分配或复制的内容并释放它即可。

    PS:下次,您的代码会比 Instruments 屏幕截图更有帮助。

    【讨论】:

    • 我在这个项目中使用了 ARC
    • 所以你不应该使用retainrelease...静态分析说什么?
    • 静态分析表明没有内存泄漏!但是对象仍然在内存中,我通过 Instruments 看到了这一点。
    • 您的对象是否存储在strong 属性中?
    • 不是直接的。我的对象是一个数组。我有一个类,它返回一个 NKIngredient 对象数组。从这个数组中,我将元素移动到另一个数组中,然后我将一个一个添加到我的视图中,并通过一个 NSTimer 对其进行动画处理。当元素准备好隐藏时,我使用 [ingredient removeFromSuperview] 将其从超级视图中删除。所以,我不把它声明为财产,我应该这样做吗?
    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多