我对ARC nad NSMutableArray有疑问。
情况如下:
我有一个带有NSMUtableArray(arr1
)的ListView,它包含listview的所有元素。一个单独的线程,在本机代码中运行,回调到objective-c ListView。本机代码创建一个新的NSMutableArray(arr2
),用我的自定义类的元素填充它(每个元素都有一个名称,id,图标等),然后将它传递给ListView。
在ListView中,首先我使用[arr1 removeAllObjects]
清除数组,然后使用arr2
将arr1
中的每个元素添加到[arr1 addObject: ..]
。
备注:
*所有代码(native和objective-c)都编译为Objective-C ++代码。
*分配和初始化arr2
(及其所有元素)并调用ListView内容的本机代码部分都在@autoreleasepool
指令下
我的问题;
本机代码是否有内存泄漏?
ListView代码是否有任何内存泄漏?我用[arr1 removeAllObjects]
发布的旧元素会导致内存泄漏吗?
@autoreleasepool是否提供与ARC相同的功能,这意味着我不必显式释放这些对象?
答案 0 :(得分:1)
本机代码是否有任何内存泄漏?
不是由于缺乏发布/自动发布(您应该查看weak/strong properties,讨论here)
ListView代码是否有任何内存泄漏?请问旧元素我 使用[arr1 removeAllObjects]发布导致内存泄漏?
没有
@autoreleasepool是否提供与ARC相同的功能,这意味着我 不必显式释放对象吗?
您无法使用ARC发布对象。 autoreleasepool将确保在关闭大括号之后销毁在其中分配的对象(如果你有一个for循环在每次传递中分配大量的东西,并且你想确保在每个传递之间清除所有内容,那么这将很有用) , 例如)。
答案 1 :(得分:1)
1)应该没有,但有时会有小漏洞(我见过一些带有钥匙串和一些音频库)。这不是你处理的问题,在大多数情况下都无法解决。
2)removeAllObjects
确实向数组中的所有对象发送释放。你可以通过在dealloc方法中设置一个断点来看到这一点。
3)是ARC @autoreleasepool的工作方式相同
您上面描述的情况对我来说是安全的。