【问题标题】:Memory is not released even though I explicitly release it即使我明确释放内存也不会释放它
【发布时间】:2012-02-26 13:25:28
【问题描述】:

我正在优化我的应用程序并确保正确实施内存管理。当我发现 didUnload / dealloc / willAppear 对于实现我的内存清理不可靠时,我决定实现我自己的方法,这样我就可以完全控制这个内存管理。

在头文件中定义我的数组

@property (retain) NSMutableArray *selectedCardIDs;
@property (retain) NSMutableArray *selectedRowArray;
@property (retain) NSMutableArray *cardArray;
@property (retain) NSMutableArray *cardIDArray;

这里是发布方法:

- (void) willReleaseObjects {
[self.aCopyOfCardIDArray release];
[self.listOfItems release];
[self.aCopyListOfItems release];
[self.selectedCardIDs release];
[self.selectedRowArray release];
[self.cardArray release];
[self.cardIDArray release];

}

数组可以变得非常大(每个 > 1'000 个条目),为什么在卸载视图后释放这些数组是必不可少的。我在IBAction方法中显式调用了这个函数,如:

- (IBAction) stopDictionary:(UIBarButtonItem *) sender {
[self closeDatabase];
[self willReleaseObjects];
[self dismissModalViewControllerAnimated:YES];

}

我调试了代码,它实际上是在执行每个版本,但是当我用 Instruments 诊断内存分配时,它似乎只释放了部分内存,实际上几乎没有为什么每次我加载它时内存消耗都会增加再看一遍,一点都不好。 任何想法,为什么我的记忆没有在这里释放?谢谢。

【问题讨论】:

    标签: ios memory-management


    【解决方案1】:

    不要在属性上调用 release,因为如果您将任何属性声明为分配或复制,则可能会发生非常糟糕的事情。您可能会释放已自动释放的返回实例。

    相反,要么释放它后面的实例变量,要么将属性设置为 nil。无论哪种方式,您都将获得正确的结果。如果您的属性上有任何 Key/Value 观察者,最好的方法是将属性设置为 nil,这会自动将值传播给任何观察者:

    - (void) willReleaseObjects {
      self.aCopyOfCardIDArray = nil;
      self.listOfItems = nil;
      ...
    }
    

    【讨论】:

    • 感谢克劳斯,我试过了,结果一样。我在我的问题中添加了属性定义,如您所见,我保留了所有这些。据我所知,所有分配的对象都应该使用 release 来释放。至少这是我迄今为止所读到的关于内存管理的内容。我不知何故有这样的印象,在我返回上一个视图之后,整个 viewController 的内容并没有被破坏。
    • 您可能需要检查您访问这些属性的任何其他位置,并确保您在某处没有额外的保留。还要确保在创建属性时不要泄漏它。例如。这将导致泄漏:self.property = [[AClass alloc] init];无论如何,我描述的方法不会导致泄漏。
    • 已解决。忘记了分配上的自动释放。对象现在在它们应该被释放的时候被释放。但是我意识到了一个不同的奇怪行为:当我启动我的主视图时,我看到大约 400 个对象被分配,但一旦显示视图,Instruments 中的分配计数器突然增加到超过 6'000。可能是正常的,所以不想再开始追逐幻影,如果这里没有什么可以解决的。想法?是否有可用于此类事情的基准?理解这一点非常有帮助,因为视图本身当然也会创建对象本身。谢谢。
    • 系统框架本身分配了相当多的小对象,但只要再次释放所有东西就不用担心了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2021-11-19
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    • 2013-12-12
    相关资源
    最近更新 更多