Сообщение от отладчика: прекращено из-за проблемы с памятью

Мое приложение работает с файлом Geojson. Я использую MapBox SDK, чтобы добавить MGLPolyline на карту. Но проблема в том, что мой файл слишком велик, поэтому приложение вылетает и выдает ошибку: Message from debugger: Terminated due to memory issue. Я столкнулся с объектами 66234 в первом цикле. Я попытался разбить массив на новый массив, но безуспешно. Пожалуйста, помогите мне решить проблему. Вот мой код для рисования на карте, а вот мой тестовый проект на github, используйте Xcode 8.1 Если также приветствуется любая другая третья сторона, которая может решить мои проблемы:

func drawPolyline() {

    // Parsing GeoJSON can be CPU intensive, do it on a background thread
    DispatchQueue.global(qos: .background).async {
        // Get the path for example.geojson in the app's bundle
        let jsonPath = Bundle.main.path(forResource: "KMLMAPNew", ofType: "json")
        let jsonData = NSData(contentsOfFile: jsonPath!)

        do {
            // Load and serialize the GeoJSON into a dictionary filled with properly-typed objects
            guard let jsonDict = try JSONSerialization.jsonObject(with: jsonData! as Data, options: []) as? Dictionary<String, AnyObject>, let features = jsonDict["features"] as? Array<AnyObject> else{return}

            for feature in features {
                guard let feature = feature as? Dictionary<String, AnyObject>, let geometry = feature["geometry"] as? Dictionary<String, AnyObject> else{ continue }

                if geometry["type"] as? String == "LineString" {
                    // Create an array to hold the formatted coordinates for our line
                    var coordinates: [CLLocationCoordinate2D] = []

                    if let locations = geometry["coordinates"] as? Array<AnyObject> {
                        // Iterate over line coordinates, stored in GeoJSON as many lng, lat arrays
                        for location in locations {
                            // Make a CLLocationCoordinate2D with the lat, lng
                            if let location = location as? Array<AnyObject>{
                                let coordinate = CLLocationCoordinate2DMake(location[1].doubleValue, location[0].doubleValue)

                                // Add coordinate to coordinates array
                                coordinates.append(coordinate)
                            }
                        }
                    }

                    let line = MGLPolyline(coordinates: &coordinates, count: UInt(coordinates.count))

                    // Optionally set the title of the polyline, which can be used for:
                    //  - Callout view
                    //  - Object identification
                    line.title = "Crema to Council Crest"

                    // Add the annotation on the main thread
                    DispatchQueue.main.async {
                        // Unowned reference to self to prevent retain cycle
                        [unowned self] in
                        self.mapboxView.addAnnotation(line)
                    }
                }
            }
        }
        catch
        {
            print("GeoJSON parsing failed")
        }
    }
}

EDIT:: @Alessandro Ornano и @fragilecat большое спасибо. Но эти решения по-прежнему не могут решить проблему закрытия приложения на iPad. Я думаю, что очень сложно изменить текущий код, чтобы заставить его работать правильно, потому что данные такие большие. Думаю, мне понадобится другое решение, работающее с большими данными. Например, разбить массив на небольшие массивы, а затем загрузить их по очереди. Но я не знаю, как начать :(

Я отправляю электронное письмо в службу поддержки MapBox с просьбой дать предложения.


person lee    schedule 03.11.2016    source источник
comment
Это основано на мнении, но я бы посоветовал, возможно, рассмотреть защитные операторы в этом случае, чтобы улучшить читаемость, избегая пирамида гибели.   -  person Matt Le Fleur    schedule 03.11.2016
comment
Пожалуйста, просмотрите обновленный код, удаляющий пирамиду гибели.   -  person lee    schedule 03.11.2016
comment
Я не могу запустить ваш проект, я не могу установить какао-боб. Я получаю сообщение, что не могу найти спецификацию для Mapbox-iOS-SDK (= 3.3). Я хотел бы спросить, запускали ли вы это с помощью инструментов для анализа того, где возникают проблемы с памятью.   -  person Peter Hornsby    schedule 08.11.2016
comment
@fragilecat: вам нужен MacOs 10.12, Xcode 8 и установите cocoapods перед запуском pod install   -  person lee    schedule 09.11.2016
comment
@lee Кажется, есть некоторые проблемы с модулями и Mapbox..   -  person Alessandro Ornano    schedule 10.11.2016
comment
И @Alessandro Ornano, и я продемонстрировали, что вы можете загружать данные, не закрывая приложение, да, оно медленное и не отвечает. Загрузка данных через куски не решит вашу проблему. Количество аннотаций просто велико. Ваш код отображает большинство улиц Сингапура. Вам нужно посмотреть, каковы ваши требования, и посмотреть, можете ли вы удовлетворить их другим способом. Возможно, вы можете использовать меньше аннотаций для масштаба карты и вводить больше по мере увеличения пользователем. Это должно помочь при рендеринге. Также было бы полезно, если бы вы указали свою конечную цель. :)   -  person Peter Hornsby    schedule 11.11.2016
comment
@fragilecat Я согласен с тобой. At lee: попробуйте пересмотреть свой json и начать с нескольких элементов, а затем добавлять их шаг за шагом, пока у вас не будет этой проблемы с памятью. Сегодня утром я проверил ваш json с помощью 3 инструментов проверки, и ваш синтаксис json в порядке.   -  person Alessandro Ornano    schedule 11.11.2016
comment
Я постараюсь больше работать над этим. Тогда скажите вам, ребята, если это работает хорошо. Еще раз большое спасибо, Алессандро Орнано и хрупкая кошка.   -  person lee    schedule 11.11.2016
comment
@lee, ты решил эту проблему? если да, то каково решение, хотя сейчас я тоже сталкиваюсь с такой же проблемой.   -  person Anilkumar iOS - ReactNative    schedule 19.03.2018
comment
@AnilkumariOSdeveloper: вы можете использовать MapBox для решения этой проблемы.   -  person lee    schedule 20.03.2018
comment
Я уже внедрил MKMapview для своих требований, теперь я не могу вернуться к мапбоксу. Даже если бы они использовали mapbox, у них была бы та же проблема, верно?   -  person Anilkumar iOS - ReactNative    schedule 20.03.2018
comment
в любом случае, есть ли какой-нибудь пример такого рода проблем для мапбокса?   -  person Anilkumar iOS - ReactNative    schedule 20.03.2018
comment
Вы можете обратиться за помощью в службу поддержки mapbox.   -  person lee    schedule 20.03.2018
comment
@lee Я сталкиваюсь с аналогичной ошибкой при использовании камеры, чтобы щелкнуть фотографии и сохранить их в массив изображений. Это происходит не сразу, но при нажатии на 15-20 фотографий и загрузке их в представление коллекции выдается эта ошибка - Прервано из-за проблемы с памятью. Не подскажете, как проследить линию или метод выявления утечки памяти? Я пробовал использовать метод didreciememorywarning и включить зомби, но ни один из них не помог.   -  person Mrunal    schedule 20.11.2018
comment
@Mrunal: я не знаю подробностей вашего кода, поэтому трудно догадаться, что это такое. Но вы можете попробовать загрузить свои изображения в фоновом потоке и использовать ленивую загрузку (lib: SDWebImage). Если вы это сделали, просто попробуйте профилировать свой проект, чтобы найти утечки памяти, выделения памяти и т. д.   -  person lee    schedule 21.11.2018
comment
@AnilkumariOSdeveloper Вы нашли решение? у меня такое же требование   -  person Abin Baby    schedule 19.04.2019
comment
@AbinBaby Нет, не нашел.   -  person Anilkumar iOS - ReactNative    schedule 22.04.2019


Ответы (7)


Одна вещь, которую я усвоил из создания приложений с интенсивным использованием памяти, заключается в том, что вы должны использовать autoreleasepool каждый раз, когда создаете переменные внутри циклов, если эти циклы длинные.

Просмотрите весь свой код и трансформируйте такие вещи, как

func loopALot() {
    for _ in 0 ..< 5000 {
        let image = NSImage(contentsOfFile: filename)
    }
}

в

func loopALot() {
    for _ in 0 ..< 5000 {
      autoreleasepool {
        let image = NSImage(contentsOfFile: filename)
      }
    }
}

Просмотрите все виды циклов for, while и т. д.

Это заставит iOS освобождать переменную и соответствующее использование памяти в конце каждого хода цикла, вместо того, чтобы удерживать переменную и ее использование памяти до завершения функции. Это значительно уменьшит использование памяти.

person Duck    schedule 11.11.2016
comment
Это значительно уменьшило проблему с памятью, но как использовать это изображение для других операций с ним? - person Sharad Chauhan; 06.04.2018
comment
вместо того, чтобы выделять одно изображение каждый раз, используйте одно и то же. - person Duck; 06.04.2018

Проблема здесь связана с эффективным управлением памятью. Вы загружаете много данных через файл json. Вы поняли, что вам нужно выполнить большую часть работы в фоновой очереди (потоке), однако проблема заключается в том, как вы обновляете пользовательский интерфейс с помощью функции DispatchQueue.main.async. В текущей версии метода drawPolyline() вы переключаетесь между фоновой очередью и основной очередью 66234 раза, учитывая количество объектов в вашем первом цикле. Также вы создавали такое же количество массивов CLLocationCoordinate2D.

Это приводит к огромному объему памяти. Вы не упоминаете никаких требований в отношении того, как вы визуализируете линии. Поэтому, если мы реструктурируем ваш метод drawPolyline(), чтобы использовать переменную экземпляра для массива CLLocationCoordinate2D, поэтому мы используем только одну, а затем обрабатываем весь файл json, прежде чем обновлять пользовательский интерфейс. Использование памяти снизилось до более приемлемых 664,6 МБ.

введите описание изображения здесь

Конечно, рендеринг может быть не совсем тем, что вы ищете, и в этом случае вы можете реструктурировать свой массив CLLocationCoordinate2D в более подходящую структуру данных.

Ниже представлен ваш класс ViewController с переписанным drawPolyline() как drawPolyline2()

import UIKit
import Mapbox

class ViewController: UIViewController, MGLMapViewDelegate {

@IBOutlet var mapboxView: MGLMapView!


fileprivate var coordinates = [[CLLocationCoordinate2D]]()
fileprivate var jsonData: NSData?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    mapboxView = MGLMapView(frame: view.bounds)
    mapboxView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    // mapboxView.setCenter(CLLocationCoordinate2D(latitude: 45.5076, longitude: -122.6736),
    //                             zoomLevel: 11, animated: false)

    mapboxView.setCenter(CLLocationCoordinate2D(latitude: 1.290270, longitude: 103.851959),
                         zoomLevel: 11, animated: false)


    view.addSubview(self.mapboxView)


    mapboxView.delegate = self
    mapboxView.allowsZooming = true

    drawPolyline2()
    //newWay()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}



func drawPolyline2() {

    DispatchQueue.global(qos: .background).async {

        if let path = Bundle.main.path(forResource: "KMLMAPNew", ofType: "json") {
            let fileURL = URL(fileURLWithPath: path)
            if let data = try? Data(contentsOf: fileURL) {

                do {

                    let dictionary = try JSONSerialization.jsonObject(with: data as Data, options: []) as? Dictionary<String, AnyObject>

                    if let features = dictionary?["features"] as? Array<AnyObject> {

                        print("** START **")

                        for feature in features {
                            guard let feature = feature as? Dictionary<String, AnyObject>, let geometry = feature["geometry"] as? Dictionary<String, AnyObject> else { continue }

                            if geometry["type"] as? String == "LineString" {
                                // Create an array to hold the formatted coordinates for our line

                                if let locations = geometry["coordinates"] as? Array<AnyObject> {
                                    // Iterate over line coordinates, stored in GeoJSON as many lng, lat arrays

                                    var featureCoordinates = [CLLocationCoordinate2D]()

                                    for location in locations {
                                        // Make a CLLocationCoordinate2D with the lat, lng
                                        if let location = location as? Array<AnyObject>{
                                            let coordinate = CLLocationCoordinate2DMake(location[1].doubleValue, location[0].doubleValue)

                                            // Add coordinate to coordinates array
                                            featureCoordinates.append(coordinate)
                                        }
                                    }

                                    // Uncomment if you need to store for later use.
                                    //self.coordinates.append(featureCoordinates)

                                    DispatchQueue.main.async {
                                        let line = MGLPolyline(coordinates: &featureCoordinates, count: UInt(featureCoordinates.count))

                                        // Optionally set the title of the polyline, which can be used for:
                                        //  - Callout view
                                        //  - Object identification
                                        line.title = "Crema to Council Crest"
                                        self.mapboxView.addAnnotation(line)

                                    }


                                }

                            }

                        }

                        print("** FINISH **")

                    }

                } catch {
                    print("GeoJSON parsing failed")
                }
            }
        }
    }
}


func drawSmallListObj(list: [Dictionary<String, AnyObject>]){
    for obj in list{
        //            print(obj)
        if let feature = obj as? Dictionary<String, AnyObject> {
            if let geometry = feature["geometry"] as? Dictionary<String, AnyObject> {
                if geometry["type"] as? String == "LineString" {
                    // Create an array to hold the formatted coordinates for our line
                    var coordinates: [CLLocationCoordinate2D] = []

                    if let locations = geometry["coordinates"] as? Array<AnyObject> {
                        // Iterate over line coordinates, stored in GeoJSON as many lng, lat arrays
                        for location in locations {
                            // Make a CLLocationCoordinate2D with the lat, lng
                            if let location = location as? Array<AnyObject>{
                                let coordinate = CLLocationCoordinate2DMake(location[1].doubleValue, location[0].doubleValue)

                                // Add coordinate to coordinates array
                                coordinates.append(coordinate)
                            }
                        }
                    }

                    let line = MGLPolyline(coordinates: &coordinates, count: UInt(coordinates.count))

                    // Optionally set the title of the polyline, which can be used for:
                    //  - Callout view
                    //  - Object identification
                    line.title = "Crema to Council Crest"

                    // Add the annotation on the main thread
                    DispatchQueue.main.async {
                        // Unowned reference to self to prevent retain cycle
                        [unowned self] in
                        self.mapboxView.addAnnotation(line)
                    }
                }
            }
        }
    }
}
func mapView(_ mapView: MGLMapView, alphaForShapeAnnotation annotation: MGLShape) -> CGFloat {
    // Set the alpha for all shape annotations to 1 (full opacity)
    return 1
}

func mapView(_ mapView: MGLMapView, lineWidthForPolylineAnnotation annotation: MGLPolyline) -> CGFloat {
    // Set the line width for polyline annotations
    return 2.0
}

func mapView(_ mapView: MGLMapView, strokeColorForShapeAnnotation annotation: MGLShape) -> UIColor {
    // Give our polyline a unique color by checking for its `title` property
    if (annotation.title == "Crema to Council Crest" && annotation is MGLPolyline) {
        // Mapbox cyan
        return UIColor(red: 59/255, green:178/255, blue:208/255, alpha:1)
    }
    else
    {
        return UIColor.red
    }
}


}

введите описание изображения здесь

person Peter Hornsby    schedule 09.11.2016
comment
Ваш код не аварийный. Но вы выводите self.mapboxView.addAnnotation(line) из состояния: if geometry["type"] as? String == "LineString" {}. Так что отображение данных на карте неправильное. С вашим решением я попытался переместить self.mapboxView.addAnnotation(line) в условие, оно все равно вылетает :( - person lee; 11.11.2016
comment
Вы должны свести к минимуму переключение между основной и фоновой очередями. Я не знаю, что вы пытаетесь нарисовать, кроме набора точек, как я уже упоминал выше, он может не получить желаемый рисунок, если это так, вам нужно создать более подробный источник данных, отличный от плоского множество. Суть в том, что вы обрабатываете свои данные, а ЗАТЕМ отображаете их на карте. Не зная вашего рисунка, я не могу дать вам более подробную информацию. Пожалуйста, предоставьте снимки экрана того, что вы пытаетесь сделать. В настоящее время, когда я запускаю ваш проект, я получаю карту Портленда ИЛИ США. - person Peter Hornsby; 11.11.2016
comment
Мой код может загрузить okie, если я уменьшу размер файла менее чем в 12 раз:for i in 0..<features.count/12. Пожалуйста, просмотрите изображение по ссылке: http://www.filetolink.com/f03e1fbff4. Но без его уменьшения приложение вылетает. - person lee; 11.11.2016
comment
Ваш код может исправить сбой, но данные на карте отображаются неправильно. Пожалуйста, сравните свое решение на карте с моим изображением по ссылке выше. Тогда, пожалуйста, дайте мне решение в деталях. Спасибо большое. - person lee; 11.11.2016
comment
Код может выводить ** START ** и ** FINISH **, но здесь приложение застряло. Невозможно увеличить, уменьшить или переместить карту. - person lee; 11.11.2016

У меня возникли проблемы с тестированием вашего проекта с модулями, поэтому я удалил модули и использовал платформу Mapbox непосредственно из здесь.

У меня нет проблем с первым запуском как в симуляторе, так и в реальном iPad (мой iPad 4 поколения), но через некоторое время у меня такая же ошибка, поэтому я исправил этот код с помощью:

DispatchQueue.main.async {
      // weaked reference to self to prevent retain cycle
      [weak self] in
      guard let strongSelf = self else { return } 
      strongSelf.mapboxView.addAnnotation(line)
}

потому что unowned этого недостаточно для предотвращения цикла сохранения. Сейчас вроде работает хорошо.

Надеюсь, поможет.

P.S. (Я использовал последнюю доступную версию Mapbox v3.3.6)


Обновление (после комментариев):

Итак, прежде всего, я делаю все свои тесты с фреймворком Mapbox, вставленным как «встроенный фреймворк».

Я внес некоторые исправления в ваш проект github только до ViewController.swift, чтобы избежать циклов сохранения. P.S. Я удаляю строки комментариев, чтобы облегчить чтение:

func drawPolyline() {
        DispatchQueue.global(qos: .background).async {
            [weak self] in
            guard let strongSelf = self else { return }
            let jsonPath = Bundle.main.path(forResource: "KMLMAPNew", ofType: "json")
            let jsonData = NSData(contentsOfFile: jsonPath!)
            do {
                guard let jsonDict = try JSONSerialization.jsonObject(with: jsonData! as Data, options: []) as? Dictionary<String, AnyObject>, let features = jsonDict["features"] as? Array<AnyObject> else{return}
                for feature in features {
                    guard let feature = feature as? Dictionary<String, AnyObject>, let geometry = feature["geometry"] as? Dictionary<String, AnyObject> else{ continue }
                    if geometry["type"] as? String == "LineString" {
                        var coordinates: [CLLocationCoordinate2D] = []
                        if let locations = geometry["coordinates"] as? Array<AnyObject> {
                            for location in locations {
                                if let location = location as? Array<AnyObject>{
                                    let coordinate = CLLocationCoordinate2DMake(location[1].doubleValue, location[0].doubleValue)
                                    coordinates.append(coordinate)
                                }
                            }
                        }
                        let line = MGLPolyline(coordinates: &coordinates, count: UInt(coordinates.count))
                        line.title = "Crema to Council Crest"
                        print(feature) // Added this line just for debug to see the flow..
                        DispatchQueue.main.async {
                            strongSelf.mapboxView.addAnnotation(line)
                        }
                    }
                }
            }
            catch
            {
                print("GeoJSON parsing failed")
            }
        }
    }

func newWay(){
        DispatchQueue.global(qos: .background).async {
            [weak self] in
            guard let strongSelf = self else { return }
            let jsonPath = Bundle.main.path(forResource: "KMLMAPNew", ofType: "json")
            let jsonData = NSData(contentsOfFile: jsonPath!)
            do {
                if let jsonDict = try JSONSerialization.jsonObject(with: jsonData! as Data, options: []) as? Dictionary<String, AnyObject> {
                    if let features = jsonDict["features"] as? Array<AnyObject> {
                        let chunks = stride(from: 0, to: features.count, by: 2).map {
                            Array(features[$0..<min($0 + 2, features.count)])
                        }
                        for obj in chunks{
                            strongSelf.drawSmallListObj(list: obj as! [Dictionary<String, AnyObject>])
                        }
                    }
                }
            }
            catch
            {
                print("GeoJSON parsing failed")
            }
        }
    }

func drawSmallListObj(list: [Dictionary<String, AnyObject>]){
        for obj in list{
            if let feature = obj as? Dictionary<String, AnyObject> {
                if let geometry = feature["geometry"] as? Dictionary<String, AnyObject> {
                    if geometry["type"] as? String == "LineString" {
                        var coordinates: [CLLocationCoordinate2D] = []
                        if let locations = geometry["coordinates"] as? Array<AnyObject> {
                            for location in locations {
                                if let location = location as? Array<AnyObject>{
                                    let coordinate = CLLocationCoordinate2DMake(location[1].doubleValue, location[0].doubleValue)
                                    coordinates.append(coordinate)
                                }
                            }
                        }
                        let line = MGLPolyline(coordinates: &coordinates, count: UInt(coordinates.count))
                        line.title = "Crema to Council Crest"
                        DispatchQueue.main.async {
                            [weak self] in
                            guard let strongSelf = self else { return }
                            strongSelf.mapboxView.addAnnotation(line)
                        }
                    }
                }
            }
        }
    }
person Alessandro Ornano    schedule 10.11.2016
comment
Вы запускаете инструменты? Течи сейчас не вижу. Попробуйте удалить приложение и установить заново, а также перезагрузить iPad и обязательно использовать последнюю версию Mapbox. Дай мне знать. - person Alessandro Ornano; 11.11.2016
comment
Я тоже использовал Mapbox v3.3.6. Пытался перезагрузить iPad, удалить и установить новое приложение, но приложение все еще работало так долго, а затем было прекращено. - person lee; 11.11.2016
comment
Запустите приложение еще раз, затем приложение зависнет в состоянии завершения. Кажется, основной поток застрял навсегда. - person lee; 11.11.2016
comment
ждем долгое время, затем получаем сообщение: Message from debugger: Terminated due to memory issue. - person lee; 11.11.2016
comment
Я пытаюсь помочь вам, но я не получаю это сообщение, ааа! Так странно… У меня нет iPad Pro, поэтому я пробовал и симулятор, и свой iPad 4, но ничего. (ПС iOS 10.1.1) - person Alessandro Ornano; 11.11.2016
comment
Спасибо за поддержку. Обновите до 10.1.1, но проблема осталась :(. - person lee; 11.11.2016
comment
Теперь я пробую другие способы получить ту же проблему. После моих попыток я узнаю свои результаты .. - person Alessandro Ornano; 11.11.2016
comment
Хорошо, я обновил свой ответ, внес некоторые исправления в ваш код, запустил множество тестов, и все кажется стабильным и в порядке, также отладочные отпечатки в порядке. Сообщите мне о ваших испытаниях. - person Alessandro Ornano; 11.11.2016

Поделюсь своим опытом решения этой странной проблемы.

Для меня приложение вылетело с сообщением «Сообщение от отладчика: завершено из-за проблемы с памятью», и инструменты не очень помогли. Так же и Память - была в зеленых пределах. Поэтому я не был уверен, что вызывает это. И отладить не удалось, и проблема конкретного устройства.

Просто перезагрузил iPhone 6 — и проблема на данный момент исчезла.

person Naloiko Eugene    schedule 11.06.2019
comment
Я столкнулся с этой проблемой при попытке сделать GPU Capture сцены SceneKit с металлическими материалами. После закрытия всех фоновых приложений сообщение исчезло. - person 0xcaff; 23.04.2020

Первое решение

Возможно, ваш цикл for работает бесконечно и каждый раз выделяет память массиву с нулевым значением. Он использует большой объем памяти, поэтому выдает эту ошибку.

Пожалуйста, проверьте, напечатав что-нибудь в цикле for.

Второе решение

Добавьте это в didReceiveMemoryWarning:

NSURLCache.sharedURLCache().removeAllCachedResponses()
NSURLCache.sharedURLCache().diskCapacity = 0
NSURLCache.sharedURLCache().memoryCapacity = 0

Вы также можете изменить политику кэширования NSURLRequest:

let day_url = NSURL(string: "http://www.example.com")
let day_url_request = NSURLRequest(URL: day_url,
    cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalAndRemoteCacheData,
    timeoutInterval: 10.0)

let day_webView = UIWebView()
day_webView.loadRequest(day_url_request)

Дополнительная информация о политиках кэширования здесь.

person User511    schedule 08.11.2016
comment
не знаю, запускаете ли вы мой тестовый проект или еще нет. Но это не решает проблему. - person lee; 09.11.2016

заставить вас заполнять выноску, это означает, что полине выполняется только при нажатии на булавку func mapView (_ mapView: MKMapView, didSelect view: MKAnnotationView)

person demopix    schedule 02.04.2017

Я получал эту ошибку и был очень сбит с толку, так как использование памяти моим приложением было довольно небольшим.

В конце концов я обнаружил, что это произошло из-за того, что я загрузил несколько файлов в виде отображаемой памяти, например:

let data = try Data(contentsOf: url, options: .mappedIfSafe)

Я не знаю, почему у меня были эти странные сбои, но простая загрузка данных обычно предотвращала сбои.

person Robert    schedule 24.06.2021