如何释放为数组分配的内存?
Posted
技术标签:
【中文标题】如何释放为数组分配的内存?【英文标题】:How do i release allocated memory for array? 【发布时间】:2017-04-12 12:35:17 【问题描述】:我不明白如何对数组进行弱引用或释放数组的分配内存,谁能告诉我如何解决这个泄漏?
var menuDetails:[[String:Any]] = []//this my global array object
即使我使用 ARC,也会出现以下泄漏。
数组内存泄漏的屏幕截图!
我只是害怕那个内存泄漏,谁能告诉我如何解决它?
【问题讨论】:
array@sharayu 的大小是多少 不知道它的动态。 这个数组是否有大量数据@sharayu 不像普通数据...有一堆字典 这里有信息丰富的答案,但是 3 字节的泄漏可能 (a) 甚至不是泄漏,并且 (b) 可能很容易成为 Swift 中的错误。 Swift 有许多已知的漏洞。 bugs.swift.org/browse/… 即使在 ObjC 中,我们也总是处理 Foundation 已知泄漏的事实。可能无法从分析工具中获得“无泄漏”。 3 个字节通常不会花很多时间。 【参考方案1】:您不想使用弱引用。如果你这样做,你的数组将立即被释放。
weak var weakArray: [[String:Any]]? = []
一创建就包含 nil。
相反,您应该在完成内容后将数组设置为 nil(或为空):
您可以使用 `menuDetails.removeAll() 删除数组中的所有条目,或者您可以更改您的声明以使其成为可选
var menuDetails:[[String:Any]]? = []//this my global array object
然后在你完成后将其设置为 nil:
menuDetails = nil
【讨论】:
这就是我要找的……简单的东西【参考方案2】:只有当另一个对象对它有强引用时,才会保留一个对象。一旦您的视图控制器消失,它很可能也会被释放,这会自动删除其对其他对象的强引用。因此,如果 imageArray 仅被消失的视图控制器强引用,则内存将自动释放。您不需要使用自动释放池。
【讨论】:
【参考方案3】:为了在数组和/或字典中存储弱引用,您需要一个中间结构。
例如:
struct WeakRef
weak var object:AnyObject?
init( _ objectRef:AnyObject?)
object = objectRef
// use WeakRef when you add object instances to your dictionary (or array)
menuDetails[0]["objectKey"] = WeakRef(yourObject)
// you will need additional code to get the actual object out of the intermediate structure
// and given that it is a weak reference you'll also need to deal with its optionality.
if let yourObject = (menuDetails[0]["objectKey"] as? WeakRef)?.object as? YourClass,
// ... do your thing with your object ...
通过将其包装在自定义运算符和泛型中可能会使语法更清晰,但这是通用的方法。
【讨论】:
以上是关于如何释放为数组分配的内存?的主要内容,如果未能解决你的问题,请参考以下文章