2017-02-04 36 views
1

我正在開發一個應用程序擴展,它需要一個URL並將其上傳到Web服務。UIAViewController附帶UIAlertAction的應用程序擴展中的內存泄露

如果上傳請求中存在錯誤,應該彈出警告,當用戶解除它時,應該完成擴展。

用儀器分析此代碼顯示有兩個NSISLinearexpression對象的內存泄漏。

我發現在關閉警報的UIAlertAction中發現了指控代碼:沒有對警報附加操作,泄漏消失。

我假設由於某種原因呼叫:

self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) 

導致與駁回UIAlertController的煩惱。

這是爲什麼發生?

這裏是我的代碼:

import UIKit 
import Social 

class ShareViewController: UIViewController { 


override func viewDidLoad() { 
    super.viewDidLoad() 
    fetchStuff() 
} 

private func sendAlert(alertMessage:String) { 

    print("alerting") 

    let alert = UIAlertController(title: "Send video to Kodi", message: alertMessage, preferredStyle: .alert) 
    let cancelAction = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.default) { 
     UIAlertAction in 
     print("Cancel Pressed") 
     self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil) 
     } 
    alert.addAction(cancelAction) 

    self.present(alert, animated: true, completion: nil) 
} 

private func fetchStuff() -> Void { 
    print("fetching") 
    guard let extensionItem = extensionContext?.inputItems[0] as? NSExtensionItem else { 
     print("Unable to get extensionItem") 
     return 
    } // check for only 1 attachment 
    let itemProvider = extensionItem.attachments as! [NSItemProvider] 
    let item = itemProvider.first 
     if (item?.hasItemConformingToTypeIdentifier("public.url"))! { 
      item?.loadItem(forTypeIdentifier: "public.url", options: nil, completionHandler: 
       { [weak self] (item: NSSecureCoding?, error: Error?) -> Void in 
        if let url = item as? NSURL { 
         print(url.absoluteString!) 
         self?.sendAlert(alertMessage: "test") 
        } 
      }) 
     } 
     else { 
      return 
     } 
    return 
    } 

} 
+0

你試過對cancelAction閉包聲明[unowned self]嗎? – TheoK

+0

是的,仍然漏水。 – Franco

回答

1

我剛做了一個類似的問題。

問題的原因是我們構建的CoreData管理器在主調度隊列中工作。所以當核心數據管理器調用我們的完成塊時,它實際上是在不同的隊列中。我說:

DispatchQueue.main.async {}

我的周圍創造對話和現在的電話和泄漏消失。希望它可以幫助:)