我正在开发一个应用扩展程序,它会获取网址并将其上传到网络服务。
如果上传请求中存在错误,则会弹出警报,当用户将其解除时,扩展程序应完成。
使用仪器分析此代码会显示两个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 :(得分:1)
我遇到了类似的问题。
问题的原因是我们构建的CoreData管理器处理了主调度队列。因此,当核心数据管理器调用我们的完成块时,它实际上位于不同的队列中。我补充说:
DispatchQueue.main.async {}
围绕我的对话框创建和当前调用,泄漏消失了。希望它有所帮助:)