如果我有一个保留计数为1的NSMutableArray,并且此数组有多个具有保留计数大于1的变量的A类对象,那么如果我释放数组,这个变量会发生什么?他们是否被迫释放每一个保留的数量和释放空间,否则他们会占用内存?如果我释放NSMutableArray被释放,如果它们的retainCount大于1,数组中的对象会发生什么?
回答
释放数组与删除数组中的所有项目具有相同的效果。也就是说,数组不再声明它们的所有权。如果其他人保留了这些对象,它们将继续存在。如果没有,他们将被释放。
这只是一组正常的内存规则。如果你保留一个对象,你必须释放它。相反,其他一些代码(如数组)也可以保留并释放该对象,但如果每个人都遵守规则,则没有人会感到惊讶。
将retain
调用看作+1,将release
调用看作-1。您的通话释放NSArray
释放NSArray
,然后这反过来将发送release
到其持有的每一个项目,但由于NSArray
对他们采取了retain
,当你加入他们来说,这只是平衡其retain
/release
电话。
通常最好集中更多的精力来平衡你的retain
和release
调用,而不是想象在任何特定时间保留的次数。
自从retainCount == 0以后,您发送该版本时,您的数组将被释放。当程序解除分配集合类型对象(如数组)时,它将对集合中的所有对象执行释放。所有发布都会减少保留计数。直到retainCount == 0才会发生取消分配。因此,如果数组中的对象具有retainCount == 2,那么在数组解除分配后,它们将具有retainCount == 1。如果没有其他变量引用这些对象中的任何一个,那么它们将继续作为内存泄漏而存在。
当数组_deallocated_时,数组只会对其所有项目执行'release',而不是像第一句所说的那样简单地释放它。此外,当您在最后一句中说“拥有”时,我认为您的意思是“有一个参考”,即指向,因为保留计数本身代表所有权。 –
谢谢,注意到并且合并。 – pokstad
严格来说,当retainCount
为1并释放数组时,数组将被“释放”。在数组解除分配之前,数组将向该数组中的每个元素发送release
消息。我想你可以想象其余的。
- 1. 如果您尝试释放已释放的对象,会发生什么情况?
- 2. 我释放一个释放对象后会发生什么?
- 3. 如果我释放对象,释放对象所属的池后会发生什么情况?
- 4. 如果调用对象被释放,调度线程会发生什么?
- 5. 我只释放对象,如果我使用alloc创建它们?
- 6. 如果我们不能释放它,malloc的行为是什么
- 7. 为什么我释放我的对象后仍然得到retainCount = 1
- 8. 我们何时应该释放一个对象,如果我们返回它?
- 9. 当包含这些对象的NSMutableArray被释放时,如何释放组合对象?
- 10. 对象分配和它们的释放
- 11. 这个对象为什么被释放?
- 12. 对象被释放 - 为什么?哪里?
- 13. 如何从数组中释放对象?
- 14. 如果我忘记在iPhone应用程序中释放对象会发生什么?
- 15. 如果我忘记释放C++中的内存会怎么样
- 16. 对象与NSMutableArray里的对象 - 对象如何释放
- 17. 将-replaceObjectAtIndex:withObject:of NSMutableArray释放被新对象替换的旧对象吗?
- 18. 如果这个条件成立,对象如何被释放?
- 19. 在.NET中发生了什么事如果发生在释放方法(〜法)
- 20. jni-释放对象数组
- 21. UIAcivityIndicatorView是否自行停止动画,如果它被移除/释放/释放
- 22. 如果我从构造函数中抛出异常,构造函数中的释放内存会发生什么?
- 23. 什么时候释放了一个自动释放的对象?
- 24. 如果我们忽略新对象的结果会发生什么?
- 25. iPhone - 苹果崩溃释放NSMutableArray
- 26. 为什么retainCount在释放被调用后返回值?
- 27. 状态,如果内存被释放
- 28. 释放NSFileManager,如果它永远不会到达发布消息
- 29. 如果我删除@EJB注释会发生什么?
- 30. 释放NSMutableArray?
对象不会被释放,直到它们的保留计数为零。他的问题是数组中的对象的保留数大于1(例如,retainCount = 2)。当数组被释放时,数组中的对象将减少其所有保留计数(例如,retainCount = 1),如果没有其他对象拥有对它们的所有权(因为retainCount> 0),它们将是内存泄漏。 – pokstad