【问题标题】:Memory Leak in iOS swift 3iOS swift 3中的内存泄漏
【发布时间】:2017-07-16 17:31:44
【问题描述】:

我最近开始使用 Swift 并学习 内存管理。而且我无法解决这个内存泄漏问题。

这是我的模型类:

class Contact {

   var name: String?
   var age: String?

   weak var address: Address?

   deinit {
      print("Contact Delloacated")
   }

}

class Address {
   var address: String?
}

我在我的控制器中使用这个模型。

class Controller: UIViewController {
  var contacts: [Contact]()?

 fetchContact() {
    let path = "some url"
    let url = URL(string: path)
    let session = URLSession.shared

    let task = session.dataTask(with: url!) { [weak self] (data, 
    response, error) in
     if error != nil {
            print(error!)
            return
        }
       if let data = data {
            do {
                let jsonResult = try JSONSerialization.jsonObject(with: 
                data, options: .mutableContainers)
                self?.contacts = [Contact]()

               let contact = Contact()

               // do some operation to get required data and append 
               //into contactList array

              self?.append?.append(contact)
  }

  override func viewDidLoad() {
    super.viewDidLoad()

    fetchContact()

    } 
}

虽然我在 Contact 模型中将 weak 用于 Address,并在“fetchContact()”的闭包中使用了“[weak self]”控制器中的方法,同时获取数据以避免保留周期。但是我仍然在 line : "self?.append?.append(contact)" 中收到内存泄漏警告。 我在 Xcode 8.3.3 中观察到仪器的泄漏。

我很困惑为什么在控制器类中仍然有强引用联系人。

【问题讨论】:

  • 为了获取所需的数据,您是否使用任何 for 循环?
  • 是的,我用for循环来解析字典。

标签: ios swift3 memory-leaks xcode8


【解决方案1】:

在您的情况下,您正在使用 for 循环来解析字典。所以,你可以使用autorelease在for循环中释放内存

把这个写在for循环里面,每次调用循环都会释放内存。

autoreleasepool {
  /* code */ 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多