2017-02-04 3 views
1

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 
    } 

} 
+0

[unowned self]をcancelActionクロージャーに宣言しようとしましたか? – TheoK

+0

はい、まだ漏れています。 – Franco

答えて

1

私は同様の問題がありました。

私の問題の原因は、私たちが構築したCoreDataマネージャがメインのディスパッチキューを処理したことにあります。したがって、コアデータマネージャが完了ブロックを呼び出すと、実際には別のキューに入っていました。私のダイアログの作成およびプレゼントコールごろ

DispatchQueue.main.async {}

をし、リークが姿を消した:私は付け加えました。希望すると助けてくれるでしょう:)

関連する問題