Ios Alamofire请求发出内存警告

Ios Alamofire请求发出内存警告,ios,swift,memory-management,memory-leaks,alamofire,Ios,Swift,Memory Management,Memory Leaks,Alamofire,我正在使用一个主细节应用程序。主屏幕是一个仪表板,在选择一个项目时,移动到详细屏幕,在那里我在后端触发一个Alamofire请求 下面是片段 class APIManager: NSObject { class var sharedManager: APIManager { return _sharedManager } private var requests = [Request]() // Cancel any ongoing down

我正在使用一个主细节应用程序。主屏幕是一个仪表板,在选择一个项目时,移动到详细屏幕,在那里我在后端触发一个
Alamofire
请求

下面是片段

class APIManager: NSObject {

    class var sharedManager: APIManager {
        return _sharedManager
    }

    private var requests = [Request]()

    // Cancel any ongoing download
    func cancelRequests() {
        if requests.count > 0 {
            for request in requests {
                request.cancel()
            }
        }
    }

    func getData(completion: (dataSet: [Data]?, error: NSError?) -> Void) {
        let request = Alamofire.request(.GET, "http://request")
            .response { (request, response, data, error) in
                dispatch_async(dispatch_get_main_queue(), {
                    if(error == nil) {
                        if let response = data, data = (try? NSJSONSerialization.JSONObjectWithData(response, options: [])) as? [NSDictionary] {

                            var dataSet = [Data]()
                            for (_, dictionary) in data.enumerate() {
                                let lat = dictionary["Latitude"]
                                let lng = dictionary["Longitude"]
                                let id = dictionary["ID"] as! Int
                                let data = Data(lat: lat!, long: lng!, id: shuttleID)
                                dataSet.append(data)
                            }
                            completion(dataSet: dataSet, error: nil)
                        }
                    } else { completion(dataSet: nil, error: error) }
                })
        }
        requests.append(request)
    }
}
我有一个单例API管理器类,并从详细视图控制器调用
getData()
函数。一切正常

但是,当我反复按下并弹出时,我看到内存迅速增加,在尝试10-15次后,我收到内存警告。但是,在
AppDelegate
中,我正在管理它以显示一条警报消息,并添加一个8秒的延迟计时器。但在20-25次尝试后,由于内存警告,应用程序崩溃

视图将消失()
中,我也会取消任何正在进行的请求。但我无法阻止内存警告问题。我对调用请求的部分进行了注释,没有发现任何问题,甚至内存消耗更少


我欢迎您的想法。

问题是您从未删除附加到成员变量“requests”的请求

您需要确保在取消请求或请求成功完成时删除该请求

执行以下修改-

    func cancelRequests() {
        if requests.count > 0 {
            for request in requests {
                request.cancel()
            }
        }
         requests.removeAll() //Delete all canseled requests
    }

also 

func getData(completion: (dataSet: [Data]?, error: NSError?) -> Void) {
        let request = Alamofire.request(.GET, "http://request")
            .response { (request, response, data, error) in
                dispatch_async(dispatch_get_main_queue(), {
                    if(error == nil) {
                        if let response = data, data = (try? NSJSONSerialization.JSONObjectWithData(response, options: [])) as? [NSDictionary] {

                            var dataSet = [Data]()
                            for (_, dictionary) in data.enumerate() {
                                let lat = dictionary["Latitude"]
                                let lng = dictionary["Longitude"]
                                let id = dictionary["ID"] as! Int
                                let data = Data(lat: lat!, long: lng!, id: shuttleID)
                                dataSet.append(data)
                            }
                            requests.removeObject(request)
                            completion(dataSet: dataSet, error: nil)
                        }
                    } else { 
                         requests.removeObject(request)
                         completion(dataSet: nil, error: error) }
                })
        }
        requests.append(request)
    }
在数组上添加此方便的扩展,以删除代码中的项:

// Swift 2 Array Extension
extension Array where Element: Equatable {
    mutating func removeObject(object: Element) {
        if let index = self.indexOf(object) {
            self.removeAtIndex(index)
        }
    }

    mutating func removeObjectsInArray(array: [Element]) {
        for object in array {
            self.removeObject(object)
        }
    }
}

通过分析,我发现内存警告不是由
Alamofire
请求引起的。这是由于
MKMapView
。加载
MKMapView
,放大和缩小会消耗更多内存。因此,在
视图中将消失
中,我进行了修复

override func viewWillDisappear(animated:Bool){
    super.viewWillDisappear(animated)
    self.applyMapViewMemoryFix()
}

func applyMapViewMemoryFix(){
    switch (self.mapView.mapType) {
        case MKMapType.Hybrid:
            self.mapView.mapType = MKMapType.Standard
            break;
        case MKMapType.Standard:
            self.mapView.mapType = MKMapType.Hybrid
            break;
        default:
            break;
    }
    self.mapView.showsUserLocation = false
    self.mapView.delegate = nil
    self.mapView.removeFromSuperview()
    self.mapView = nil
}
礼貌-