我有以下代码向Google Places API Web服务发出get请求。该函数在包含类似性质的函数的公共结构中的另一个静态函数内声明。
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)
}
}
}
}
我仍在学习swift,我知道可以在闭包中捕获强引用。我面临的问题是由Alamofire请求返回的响应导致的内存泄漏。我使用泄漏工具发现泄漏的对象是_NativeDictionaryStorageOwner和_NativeDictionaryStorageImpl。一旦释放了malloced的内存,就会对可能不再存在的对象进行多次释放调用。我不知道如何解决这个问题,我已经寻找替代方案,但这些替代方案会导致更多泄漏。有人可以解释究竟发生了什么吗?如何修复此内存泄漏?
答案 0 :(得分:0)
从这一段代码中诊断漏洞很难,但是找到内存泄漏和保留周期的原因的一个很好的新工具是&#34; Debug Memory Graph&#34 ;工具。当您的应用程序运行时,单击此按钮,它将显示内存中的所有对象以及对它们的引用。