【问题标题】: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 个字节通常不会花很多时间。

标签: ios xcode memory-leaks swift3


【解决方案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 ...
    
    }
    

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

    【讨论】:

      猜你喜欢
      • 2011-11-05
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多