2016-11-05 11 views
0

Google Places API Webサービスにリクエストを送信する次のコードがあります。この関数は、同様の性質を持つ関数を含むpublic構造体の中の別の静的関数の中で宣言されています。以下はalamofireでメモリリークを回避する方法は?

private static func GSearchRequest(_ url: URLConvertible, 
            parameters: Parameters? = nil, 
            parser: @escaping (Array<[String:NSObject]>?) -> Void) 
{ 
    let queue = DispatchQueue(label: "com.cnoon.response-queue", 
           qos: .utility, attributes: [.concurrent]) 
    Alamofire.request(url, 
      method: .get, 
      parameters: parameters, 
      encoding: URLEncoding.default) 
     .responseJSON(queue: queue, completionHandler: { 
      response in 
      print(response) 
     }) 
} 

私はまだ迅速学んでいると私は強い参照が閉鎖内に捕捉することができます知っています上記

static func GSearh(_ query: String, location: CLLocation?, 
        parser: @escaping (Array<[String:NSObject]>?)->Void, 
        host: UIViewController?) { 
    if let current_vc = host { 
     if !Reachability.isConnected() { 
      current_vc.view.offlineViewAppear() 
     } 
    } 
    let coordinate: CLLocationCoordinate2D? 
    if let manager: CLLocation = location { 
     coordinate = manager.coordinate 
     if let coords = coordinate { 
      if let apiKey = appDelegate?.getApiKey() { 
       let latitude = coords.latitude 
       let longitude = coords.longitude 
       let params: Parameters = 
        ["location":"\(latitude),\(longitude)", 
         "rankby":"distance", "type":"\(query)", 
         "key":"\(apiKey)"] 
       GSearchRequest(URL, parameters: params, 
           parser: parser) 
      } 
     } 
    } 
} 

呼び出される関数です。私が直面している問題は、Alamofireの要求から返された応答によって引き起こされるメモリリークです。私は、漏れたオブジェクトが_NativeDictionaryStorageOwnerと_NativeDictionaryStorageImplであることを見つけるために、リーク計測器を使用しました。 mallocされたメモリが解放されると、もはや存在しなくなる可能性のあるオブジェクトの解放がいくつか行われます。私はこれを修正する方法を知りませんし、代替案を探しましたが、それらの代替案はより多くのリークを引き起こします。誰かが正確に何が起こっているか説明してもらえますか?このメモリリークを修正するにはどうしたらいいですか?

+0

「GSearh」と呼ばれるもの(または「GSearch」である必要がありますか?)。 'parser'パラメータがどのように見えるかを知ることは重要です。クロージャは、保持サイクル(およびリーク)が作成される共通の場所です。 – Jerry

+0

上記のコードから漏れているようには見えません。パーサを投稿できますか?サイドノート:Webサービスコールを処理するコードでUIを操作するのは良い方法ではありません。 –

+0

@ Jerryの場合、パーサーは結果を配列にマップしますが、リークは受信した応答によって発生します。私はほとんどのコードを廃止しました。パーサーを完全に削除しても、まだ漏れがあります – NotMe

答えて

0

このコードだけでリークを診断するのはかなり難しいでしょうが、メモリリークの原因を突き止めてサイクルを保持するための素晴らしいツールは、「デバッグメモリグラフ」ツールです。アプリケーションが実行されている間、このボタンをクリックすると、メモリ内のすべてのオブジェクトとそのオブジェクトへの参照が表示されます。

関連する問題