2016-11-05 250 views
0

我有以下代碼向Google Places API Web服務發出獲取請求。該函數在包含類似性質的函數的公共結構中的另一個靜態函數中聲明。如何避免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。一旦mableced的內存被釋放,幾個釋放調用是針對可能不再存在的對象進行的。我不知道如何解決這個問題,我已經尋找替代品,但這些替代品會導致更多的泄漏。有人能解釋究竟發生了什麼嗎?我該如何解決這個內存泄漏問題?

+0

什麼叫'GSearh'(或者它應該是'GSearch'?)。瞭解'parser'參數的樣子很重要。封閉是保留週期(和泄漏)產生的常見場所。 – Jerry

+0

從上面的代碼看,它看起來不會泄漏,你可以發佈你的解析器嗎?附註:在處理Web服務調用的代碼中操作UI並不是好習慣。 –

+0

@Jerry,解析器將結果映射到數組,但泄漏是由收到的響應引起的。我已經取消了大部分代碼,甚至當我徹底刪除解析器時,仍然會泄漏 – NotMe

回答

0

從這一點代碼來診斷泄漏是相當困難的,但尋找內存泄漏和保留週期的原因的一個很好的新工具是「調試內存圖」工具。當您的應用程序正在運行時,單擊此按鈕,它將向您顯示內存中的所有對象以及對它們的引用。