urlを取得してウェブサービスにアップロードするアプリ拡張を開発しています。UiViewControllerにUIAlertActionを付けたアプリ拡張のメモリリーク
アップロードリクエストにエラーがある場合、アラートがポップアップし、ユーザーがそれを閉じると、拡張が完了するはずです。
このコードを計測器でプロファイリングすると、2つの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
}
}
[unowned self]をcancelActionクロージャーに宣言しようとしましたか? – TheoK
はい、まだ漏れています。 – Franco