2016-11-05 27 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

从这一点代码来诊断泄漏是相当困难的,但寻找内存泄漏和保留周期的原因的一个很好的新工具是“调试内存图”工具。当您的应用程序正在运行时,单击此按钮,它将向您显示内存中的所有对象以及对它们的引用。