ios - 从 NSObject 派生时,Swift iOS 内存泄漏指示 XCode8

标签 ios swift memory-leaks nsobject

Xcode8 在仪器和内存图中显示内存泄漏。我已将其缩小为:从 NSObject 派生会产生泄漏指示。我不知道为什么。

我需要一个 NSObject 以便稍后使用 @objc 指令。

存储在 mDict 字典中的测试实例在 Xcode 中被指示为泄漏。

这是在运行 iOS10.0 的 iPhone5s 模拟器中作为 iOS 单 View 应用程序项目运行

import Foundation

class Test: NSObject  // <-- derived from NSObject produces leak indication below
{
    static var cTest: Test! = nil
    var mDict: [String : Test] = Dictionary<String, Test>()

    static func test() -> Void {
        cTest = Test()
        cTest.mDict["test"] = Test() // <-- alleged leak
    }
}

class Test  // <-- NOT derived from NSObject, NO leak indication
{
    static var cTest: Test! = nil
    var mDict: [String : Test] = Dictionary<String, Test>()

    static func test() -> Void {
        cTest = Test()
        cTest.mDict["test"] = Test() // <-- NO leak
    }
}

// from AppDelegate didFinishLaunchingWithOptions
// ...
    Test.test()
// ...

最佳答案

swift 中的内存管理与类的 objective-c 有点不同。与执行 class Test: NSObject 相比,您可能会错过这个特性。 如果您尝试 class Test: AnyObject,您必须解决您的问题。

或者每次用完后都尝试使用deinit

class Test: NSObject  // <-- using deinit
{
   static var cTest: Test! = nil
   var mDict: [String : Test] = Dictionary<String, Test>()

   static func test() -> Void {
      cTest = Test()
      cTest.mDict["test"] = Test() // <-- alleged leak
   }

   deinit {

   }
}

但最佳做法是将其声明为 weak 变量,例如 weak var test: Test? 在您的情况下

关于ios - 从 NSObject 派生时,Swift iOS 内存泄漏指示 XCode8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40044737/

相关文章:

ios - NSRangeException 崩溃无法删除 "heading"的观察者

ios - 苹果企业程序分发问题

c++ - Visual C++ - 内存泄漏检测

ios - 只有一个开关打开

ios - 在 iOS 6 中将 5112225.14 转换为 5,112,225.14

swift - 如何快速从核心数据中删除对象

ios - 缩小图像的质量非常低?

ios - 当我返回菜单时,应用程序崩溃(线程 1 : signal SIGABRT)

java - JDBC bulkcopy 中可能的内存泄漏

java - 设置 MetaspaceSize 的指南 - java 8