iOS swift 3中的内存泄漏

Posted

技术标签:

【中文标题】iOS swift 3中的内存泄漏【英文标题】:Memory Leak in iOS 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循环来解析字典。 【参考方案1】:

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

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

autoreleasepool 
  /* code */ 

【讨论】:

以上是关于iOS swift 3中的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

swift playground / deinit 中的内存泄漏未一致调用

Swift 中 ALAssetRepresentation CGImage 的内存泄漏

Swift 4 ImageIO_jpeg_Data 中的内存泄漏 UIImage

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

NSArray 上的 Swift 内存泄漏

OpenCV Python:如何避免 py3 中的 cv2.imwrite() 内存“泄漏”?