Утечка памяти в CallOuts? - PullRequest
       13

Утечка памяти в CallOuts?

0 голосов
/ 31 октября 2018

работал над изучением Swift последние 2 месяца или около того. Инструменты говорят, что у меня утечки памяти каждый раз, когда я вызываю аннотацию на моем mapView. Я предполагаю, что это связано с классом, который я использую для аннотаций, но я не уверен (когда я загружаю аннотации, инструменты не показывают утечки, и всякий раз, когда я пытаюсь изменить var pointOfInterest на слабый или неизвестный) XCode заставляет меня принудительно развернуть все).

У меня будут утечки памяти без использования слабого или неизвестного var в одном из классов?

У меня недостаточно очков для публикации изображений, но инструменты говорят, что у меня есть утечки:

  • CGDataProvider
  • CFData
  • CGImage
  • CFAllocator

и когда я возвращаюсь к одному из них (CGDataProvider показан ниже), все совпадает, за исключением malloc в верхней части списка.

  • Malloc +1 1 00: 21.055.530 CoreGraphics CGTypeCreateInstance

  • CFRetain +1 2 00: 21.055.540 CoreGraphics CGDataProviderRetain

  • CFRelease -1 1 00: 21.055.543 MapKit - [_ MKCalloutLayer _newContentImage]

Классы для точек и аннотаций:

class PointOfInterest: NSObject {
    var name: String
    var coordinate: CLLocationCoordinate2D
    var type: String

    init(name: String, coordinate: CLLocationCoordinate2D, type: String) {
        self.name = name
        self.coordinate = coordinate
        self.type = type
    }

}

class POIAnnotation: NSObject, MKAnnotation {
    var pointOfInterest: PointOfInterest
    var coordinate: CLLocationCoordinate2D { return pointOfInterest.coordinate }
    var type: String { return pointOfInterest.type}

    init(point: PointOfInterest) {
        self.pointOfInterest = point
        super.init()
    }

    var title: String? {
        return pointOfInterest.name
    }

    var subtitle: String? {
        return pointOfInterest.type
    }

    var markerTintColor: UIColor  {
        switch type {
        case "Route":
            return .black
        case "Animals":
            return .yellow
        case "General":
            return .cyan
        case "Dining":
            return MyColors.diningGreen
        case "Shopping":
            return MyColors.shoppingRed
        case "Catering":
            return MyColors.cateringOrange
        case "Aviaries":
            return .purple
        case "Restrooms":
            return .blue
        case "Water Fountains":
            return .blue
        default:
            return .gray
        }
    }

    var imageName: String? {
        //these glyphs should scale from 20 to 40px https://icons8.com/
        if type == "Animals" { return "Animal Icon" }
        if type == "Aviaries" { return "Aviary" }
        if type == "Restrooms" { return "Restroom Icon" }
        if type == "Dining" { return "Dining Icon" }
        if type == "Catering" { return "Dining Icon" }
        if type == "Shopping" { return "Shopping Icon" }
        return "Flag"
    }

    var summaryText: String? {

        if let mySummary = Summaries.summaryTextDictionary[pointOfInterest.name] {
            return mySummary
        } else {
            return "No summary found"
        }

    }

}

class PlaceMarkerView: MKMarkerAnnotationView {
override var annotation: MKAnnotation? {
    willSet {
        // 1
        guard let place = newValue as? POIAnnotation else { return }
        canShowCallout = true
        calloutOffset = CGPoint(x: -5, y: 5)
        rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
        displayPriority = .required

        // 2
        markerTintColor = place.markerTintColor
        if let imageName = place.imageName {
            glyphImage = UIImage(named: imageName)
        } else {
            glyphImage = nil
        }

    }
}

}

...