如何释放为数组分配的内存?

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 ...


通过将其包装在自定义运算符和泛型中可能会使语法更清晰,但这是通用的方法。

【讨论】:

以上是关于如何释放为数组分配的内存?的主要内容,如果未能解决你的问题,请参考以下文章

java编程入门8 数组

需要有关 C++ 中二维数组的动态内存分配的帮助

解析PHP中的内存管理,PHP动态分配和释放内存

如何为多维数组动态分配内存

我应该使用哪个内存(堆或堆栈)来分配像 100MB 这样的大内存?

如何将 Marshal.AllocHGlobal 分配的内存清零?