2016-08-24 5 views
1

Abend, meine Frage ist voll von Theorie.iOS-Objekt oder Vertreter zwischen zwei Controllern?

Ich verstand von Apple-Entwickler-Dokumentation zu lesen, die besser ist die Delegierten Muster zu verwenden Spur einiger Objektattribute zu halten. Auf diese Weise können wir auf den Delegaten zugreifen, ohne auf das Objekt zugreifen zu müssen. (Ich wirklich nicht den Grund dieser Wahl)

ich auch verstanden, dass besser ist, zu definieren: protocolDelegate: class und wenn wir die Delegierten in der Klasse deklarieren ist es besser, das weak Wort zu verwenden, um einig „Art zu verhindern des Problemzyklus ". (??)

So, während ich ein wenig mit Code zu spielen, habe ich entdeckt, dass Sie keine weak delegate zwischen zwei view controllers, weil natürlich passieren kann, wenn Sie den Controller zu ändern, die weak delegate wird sich gelöscht werden, weil eine weak Sache ist (oder zumindest das ist, was ich verstanden habe).

Also muß ich zwischen zwei Optionen wählen:

  • der Delegierten „stark“ machen die weak Schlüssel zu löschen.

  • oder übergeben Sie das Objekt im Segment, und behalten Sie den Delegaten als weak.

Ich habe viel Verwirrung, können Sie meine Meinung klären? : D

Antwort

2

Der Zyklus Sie sich beziehen sind behalten ein Zyklus genannt wird.

Verwenden wir ein konkretes Beispiel, um dies zu klären: sagen Sie, Sie haben eine UIViewController, die eine UITableView hat. Der View-Controller hat einen starken Bezug zur Tabellenansicht. Der Ansichtscontroller möchte nun als Delegierter für die Tabellenansicht fungieren.

Wenn nun die Tabellenansicht eine starke Referenz auf ihren Delegaten hätte, hätten wir folgende Situation: Der View Controller hat eine starke Referenz auf die Tabellenansicht, und die Tabellenansicht hätte wiederum eine starke Referenz zurück zum View-Controller. Daher kann keiner von beiden jemals aufgelöst werden.

Um diesen Zyklus zu unterbrechen, sind die Verweise auf Delegaten normalerweise schwach. Dadurch kann der Retain-Count des View-Controllers schließlich auf 0 fallen, was wiederum die Tabellenansicht freigeben kann.

Ihre Klassen, die Delegaten verwenden möchten, sollten ebenfalls diesem Muster folgen und schwache Verweise auf ihre Delegaten verwenden. Sie sollten also die erforderlichen Referenzen über Ihren Weg weitergeben.

+0

Sie sagen also, dass ich das Objekt in der Überleitung übergeben sollte? –

+1

Ich bin mir nicht sicher, worauf "Objekt" in diesem Fall bezieht. Sie haben das Design Ihrer Apps in dieser Hinsicht nicht detailliert beschrieben, daher ist es schwierig, Ihnen Ratschläge zu geben. Aber ich empfehle Ihnen, Ihre 'delegate'-Eigenschaft' weak' zu machen, da dies eine Konvention ist, der alle folgen (Gründe werden in meiner Antwort erklärt). – DarkDust

+0

Danke! Alles klar! –

1

Ich denke, übergeben Sie das Objekt mit Überleitung, Segues sind ein sehr wichtiger Teil der Verwendung von Storyboards in Xcode. Wir können über die verschiedenen Arten von segues ein anderes Mal gehen, aber dieses zeigt Ihnen, wie Sie den "Show" -Sequenz, sowie wie pass data between die zwei View-Controller verwenden, um die zweite mit was auch immer benutzerdefinierte Daten erforderlich ist anzupassen.

Sie können problemlos Beispiele verwenden; Unter unterhalb Sie currentstring zu destinationViewController innerhalb sentstring senden können, auch ShowSegue ist Ihr segue identifier

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "ShowSegue" { 
     if let destinationVC = segue.destinationViewController as? OtherViewController { 
      destinationVC.sentstring = currentstring 
     } 
    } 

} 
+0

Vielen Dank, aber ich wusste bereits diesen Teil, meine Frage war über Segue und Delegierte, aber wirklich danke :) –

1

Navigation zwischen Viewcontrollers halten stack von Viewcontrollers.

Zum Beispiel aVC ist firstviewcontroller dann oben auf dem Stack aVC sein,

jetzt, wenn Sie drücken oder einen anderen Viewcontroller zeigen sagen bVC dann jetzt oben auf statck bVC ist. So sieht Stapel wie

aVC -> bVC(top)

jetzt Sie eine andere cVC schieben dann,

aVC -> bVC -> cVC(top).

So ist der oberste Stapel für den Benutzer immer sichtbar.

bei aktuellen Situation, Avc und BVC und CVC sind ausplanen nicht. Sie sind in Erinnerung. Aber wenn Sie cVC pop oder entlassen, dann wird es aus dem Speicher freigeben und jetzt Ihre Oberseite des Stapels looka,

aVC -> bVC(top).

Viewcontrollers leben im Stapel, bis sie nicht entfernt oder entfernt werden. Sie sind also standardmäßig eine strog-Referenz.

Segue ist nichts aber man kann sagen, dass sie grafische Darstellung von Push oder Pop-Operation sind.

eine andere Sache ist, dass Delegierte weak dass sein sollte, weil es schaffen können Zyklus beibehalten, wenn sie stark sind.

können Sie delegieren als representative im allgemeinen Sinn genannt.

Nun, wenn Sie segue verwenden, senden Sie Ihre Objekt in prepareForsegue und es wird alles andere verwalten.

2

Ich werde mich auf den ersten Teil Ihrer Frage konzentrieren, da die vorherigen Antworten den Rest ziemlich gut abgedeckt haben.

Betrachten Sie die folgende Situation: Sie haben eine Klasse, die eine Art von Netzwerkverbindung behandelt - es sendet eine Anfrage an einen Server und erhält eine Antwort. Außerhalb dieser Klasse gibt es einen ViewController, der über eine Schaltfläche verfügt, die die Anforderung auslöst, und über eine Sicht, die die Antwort für den Benutzer darstellt.

Grundsätzlich sollte die Netzwerk-Handling-Klasse in der Lage sein, eine Nachricht von der viewController (Taste gedrückt) einerseits und übergeben Sie die ViewController die Antwort auf der anderen Seite. Es sollte also eine bidirektionale Kommunikation zwischen den beiden Klassen geben. Während die Übergabe der buttonPressed-Nachricht an die Netzwerk-Handling-Klasse ziemlich offensichtlich ist, ist der umgekehrte Teil (Übergabe der Antwort) ein wenig komplizierter, da die Netzwerk-Handling-Klasse nicht wissen sollte, wer sie erstellt hat und wer sie aufruft (gute OO Praktiken und Speicherlecks Prävention).

Das ist der Punkt, an dem das Delegatenmuster hereinkommt. Es erlaubt einem Objekt, Daten an jeden zu übermitteln, der daran interessiert ist, ohne etwas über den Empfänger zu wissen.Die Klasse, die die Antwort übergibt, kennt nur einen "Delegierten" und keine andere Klasse. Außerdem können Sie die Netzwerkhandhabungsklasse unverändert übernehmen und in ein anderes Projekt einfügen. Da es keine andere Klasse aus seinem ursprünglichen Projekt kennen sollte, sondern nur ein "Delegierter", kann es ohne Modifikationen in ein anderes Projekt eingefügt werden.

Ich hoffe, es kann Ihnen helfen, den Grund der Wahl zu bekommen.

Verwandte Themen