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
}
}
你試過對cancelAction閉包聲明[unowned self]嗎? – TheoK
是的,仍然漏水。 – Franco