iOS - 在ARC上混淆并清除对象的NSMutableArray

时间:2011-11-10 15:07:04

标签: ios memory-management nsmutablearray automatic-ref-counting

我对ARC nad NSMutableArray有疑问。

情况如下:

我有一个带有NSMUtableArray(arr1)的ListView,它包含listview的所有元素。一个单独的线程,在本机代码中运行,回调到objective-c ListView。本机代码创建一个新的NSMutableArray(arr2),用我的自定义类的元素填充它(每个元素都有一个名称,id,图标等),然后将它传递给ListView。

在ListView中,首先我使用[arr1 removeAllObjects]清除数组,然后使用arr2arr1中的每个元素添加到[arr1 addObject: ..]

备注

*所有代码(native和objective-c)都编译为Objective-C ++代码。

*分配和初始化arr2(及其所有元素)并调用ListView内容的本机代码部分都在@autoreleasepool指令下

我的问题;

  1. 本机代码是否有内存泄漏?

  2. ListView代码是否有任何内存泄漏?我用[arr1 removeAllObjects]发布的旧元素会导致内存泄漏吗?

  3. @autoreleasepool是否提供与ARC相同的功能,这意味着我不必显式释放这些对象?

2 个答案:

答案 0 :(得分:1)

  

本机代码是否有任何内存泄漏?

不是由于缺乏发布/自动发布(您应该查看weak/strong properties,讨论here

  

ListView代码是否有任何内存泄漏?请问旧元素我   使用[arr1 removeAllObjects]发布导致内存泄漏?

没有

  

@autoreleasepool是否提供与ARC相同的功能,这意味着我   不必显式释放对象吗?

您无法使用ARC发布对象。 autoreleasepool将确保在关闭大括号之后销毁在其中分配的对象(如果你有一个for循环在每次传递中分配大量的东西,并且你想确保在每个传递之间清除所有内容,那么这将很有用) , 例如)。

答案 1 :(得分:1)

1)应该没有,但有时会有小漏洞(我见过一些带有钥匙串和一些音频库)。这不是你处理的问题,在大多数情况下都无法解决。

2)removeAllObjects确实向数组中的所有对象发送释放。你可以通过在dealloc方法中设置一个断点来看到这一点。

3)是ARC @autoreleasepool的工作方式相同

您上面描述的情况对我来说是安全的。