2016-06-01 8 views
0
public class somethingViewController{ 
    func viewDidLoad(){ 
     let contentImageView = UIImageView() 
     let contentImageViewTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(somethingViewController.tapped(_:))) 
     contentImageView.addGestureRecognizer(contentImageViewTapRecognizer) 
     let stackView = OAStackView(arrangedSubviews: [contentImageView]) 
     self.view.addSubview(stackView) 
    } 
    func tapped(sender: UITapGestureRecognizer){ 
     //tapped 
    } 
} 

Ich glaube nicht, dass dies ein starker Referenzzyklus ist, aber ich kann falsch liegen. Der Grund, warum ich denke, könnte ein starker Referenzzyklus sein, weil stackView Punkte auf contentImageView zeigt, die zurück auf somethingViewController über seinen Selektor in der Tap-Erkennung zeigt.Wird diese Situation einen starken Referenzzyklus erzeugen?

Wenn es ein starker Referenzzyklus ist, wie löse ich das Problem?

+1

Gesture Erkenner halten keinen starken Hinweis auf ihre 'target', so deshalb gibt es keinen starken Referenzzyklus. – Rob

+0

Sie können '#selector (tapped)' anstelle des vollständigen Namens '#selector (somethingViewController.tapped (_ :))' schreiben. BTW-Klassen werden normalerweise wie 'SomethingViewController' benannt, beginnend mit Großbuchstaben. – kennytm

Antwort

4

Es gibt keinen starken Zyklus, es gibt keine Probleme. Im target-action pattern, behalten die Kontrolle nicht das Ziel:

Steuer Objekte nicht (und sollte nicht), um ihre Ziele zu halten. Clients von Steuerelementen, die Aktionsnachrichten senden (normalerweise Anwendungen), sind jedoch dafür verantwortlich sicherzustellen, dass ihre Ziele für den Empfang von Aktionsnachrichten verfügbar sind. Zu diesem Zweck müssen sie möglicherweise ihre Ziele in speicherverwalteten Umgebungen beibehalten. Diese Vorsichtsmaßnahme gilt gleichermaßen für Stellvertreter und Datenquellen.

Dies bedeutet, dass keine starke Referenz vom Gestenerkenner zum View-Controller vorhanden ist.

Der gesamte Zyklus:

self 
↳ self.view (strong) 
    ↳ stackView (strong, via subviews) 
     ↳ contentImageView (strong, via subviews) 
      ↳ contentImageViewTapRecognizer (strong, via gestureRecognizers) 
      ↳ self (**weak**, via target) 
0

Dies wird bleiben, bis Ihre Klasse im Navigationsstapel ist oder bis Ihre Klasse lebt Ich meine nicht zerstört. So können Sie es strong reference aber nicht strong reference cycle sagen. Wenn du einen anderen View-Controller drückst oder präsentierst, ist er im Speicher und es ist in Ordnung. Das ist normales Verhalten. Also, there is nothing wrong in it, also müssen Sie nichts lösen.

+1

Ja bedeutet starke Referenz, nicht zyklisch. Recht! Aktualisierte Antwort! – Lion

Verwandte Themen