如何在不创建内存泄漏的情况下清除自定义对象的NSMutableArray?

Gre*_*reg 15 iphone memory-leaks objective-c nsmutablearray ios

如果我有一个自定义对象的NSMutableArray,我怎么能轻松清除数组而不会引起任何内存问题?假设自定义对象类中有一个dealloc方法,它正确地释放了一个实例变量等.

例如,可以使用NSArray"removeAllObjects"方法吗?

  • 如果是 - 这是如何工作的 - "removeAllObjects"会在每个对象上调用"dealloc"方法,因为它会删除它们

  • 如果不是 - 最简单的方法是什么?

编辑(4回复后) - 在回复之后的最后一个澄清问题 - 我仍然不太确定我设置保留的自定义对象中的实例变量/属性?这些似乎只能通过我的自定义对象类中的"dealloc"方法释放,我们手动执行此操作以及[super release].

因此,如果重新清除数组,如果我执行removeAllObjects,然后NSArray向我的自定义对象发出"释放",但不调用"dealloc",那么我的实例变量如何释放?

Mat*_*uch 33

removeAllObjects将从数组中删除该对象.此过程将向对象发送释放消息,这将减少其引用计数.当引用计数达到零时,将释放对象.

不要这样做,因为它会泄漏.

NSObject *object = [[NSObject alloc] init];       + 1
[array addObject:object];                         + 1
[array removeAllObjects];                         - 1
                                                =======
                                                = + 1 -> Leak
Run Code Online (Sandbox Code Playgroud)

这是正确的方法:

NSObject *object = [[[NSObject alloc] init] autorelease]; + 1 (from alloc) - 1 (from autorelease)
[array addObject:object];                         + 1
[array removeAllObjects];                         - 1
                                                =======
                                                =   0 -> Object will be deallocated
Run Code Online (Sandbox Code Playgroud)

您可以只释放数组,而不是调用removeAllObjects.如果一个数组被释放,那么它内部的所有东西都会被释放,如果没有对该对象的其他引用,它将被解除分配.

  • 使用ARC时,系统会以第一种方式正确处理这种情况,不是吗? (6认同)