verursacht habe ich die folgende Funktion:einen Verschluss Passing ein Speicherleck
func attachToComment(_ data: Data, url: URL?, type: MediaType) {
self.dismiss(animated: true, completion: nil)
let image = UIImage(data: data)!
model.attachmentData = data
model.attachmentVideoURL = url
model.attachmentType = type
toolbar.attachImage(image, withType: type)
}
Dies ist ein Hinweis auf einen View-Controller übergeben, die modal dargestellt:
containerNavViewController.attachToComment = attachToComment
ContainerNavViewController
ist ein UINavigationController
, die hat ein Container View Controller in ihm. Dies zeigt die Kamera und nachdem das Bild aufgenommen wurde, übergibt sie die attachToComment
Funktion an den nächsten View-Controller - EditImageViewController
. Innerhalb ContainerNavViewController habe ich den folgenden Code:
var attachToComment: ((_ data: Data, _ url: URL?, _ type: MediaType) ->())?
var model = CameraModel()
....
editImageViewController.attachToComment = self.attachToComment
editImageViewController.model = model
self.navigationController?.pushViewController(editImageViewController, animated: false)
Innen EditImageViewController ich den folgenden Code haben, der die Schließung nennt:
attachToComment(model.imageData, model.videoURL, model.mediaType)
Diese ruft dann die ursprüngliche Funktion und entlässt den Modal-View-Controller. Diese Ansichten werden jedoch nicht als Deinit bezeichnet und sie "leben" sehr im Hintergrund. Wo ist mein Speicherleck und wie kann ich es verhindern?
Es sieht so aus, als ob Sie einen Retain-Zyklus haben könnten. Self besitzt stark attachToComment (Closures sind erstklassige Objekte), innerhalb der Closure referenzieren Sie self und Variablen, die zu self gehören (Model, Toolbar und die Funktion fill). Als Ergebnis besitzt das Selbst den Verschluss, der Verschluss fängt selbst stark ein und keiner wird sich jemals wieder entziehen, weil sie sich gegenseitig zurückhalten. – Dare