应用程序扩展中的内存泄漏,UIAlertAction附加到UiViewController

时间:2017-02-04 12:25:38

标签: ios swift xcode

我正在开发一个应用扩展程序,它会获取网址并将其上传到网络服务。

如果上传请求中存在错误,则会弹出警报,当用户将其解除时,扩展程序应完成。

使用仪器分析此代码会显示两个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
    }

}

1 个答案:

答案 0 :(得分:1)

我遇到了类似的问题。

问题的原因是我们构建的CoreData管理器处理了主调度队列。因此,当核心数据管理器调用我们的完成块时,它实际上位于不同的队列中。我补充说:

DispatchQueue.main.async {}

围绕我的对话框创建和当前调用,泄漏消失了。希望它有所帮助:)