我如何释放阵列的已分配内存?

时间:2017-04-12 12:35:18

标签: ios xcode memory-leaks swift3

我不明白如何给阵列提供弱参考或释放数组的已分配内存,有人能告诉我如何解决这个漏洞吗?

 var menuDetails:[[String:Any]] = []//this my global array object

即使我使用ARC也会出现以下泄漏。

数据内存泄漏的屏幕截图!

Screen Shot

我只是害怕内存泄漏,任何人都可以告诉我该如何修复它?

3 个答案:

答案 0 :(得分:3)

您不想使用弱引用。如果这样做,您的阵列将立即释放。

weak var weakArray:[[String:Any]]? = []

创建后会立即包含nil。

相反,您应该在完成内容后将数组设置为nil(或为空):

您可以使用`menuDetails.removeAll()删除数组中的所有条目,或者您可以更改声明以使其成为可选

var menuDetails:[[String:Any]]? = []//this my global array object

然后当你完成它时将其设置为nil:

menuDetails = nil

答案 1 :(得分:0)

只有在另一个对象具有强引用对象时,才会保留该对象。一旦视图控制器消失,它很可能也会被释放,这会自动删除对其他对象的强引用。因此,如果imageArray仅被消失的视图控制器强烈引用,则内存将自动释放。您不需要使用autoreleasepool。

答案 2 :(得分:0)

为了在数组和/或字典中存储弱引用,您需要一个中间结构。

例如:

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

}

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