работал над изучением 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
}
}
}
}