Delegierte in Objective-c

8

Ist es in objective c üblich, den Controller als Stellvertreter für verschiedene Protokollimplementierungen zu verwenden? Ich spreche über die Verwendung des iOS-SDK oder ist es eine gute Idee, separate Klassen zu haben, die die Rolle eines Delegaten übernehmen? Oder ist es einfach nur das, was am besten zu dem Szenario passt? Ich bin größtenteils neugierig auf Best Practices in Objective c, da ich lerne, es isoliert zu programmieren und keinen "echten" Experten zu haben, an den ich mich wenden kann.

    
Maleck13 14.06.2011, 12:12
quelle

6 Antworten

7

"Controller" konzentriert sich auf Besitz und Fassade. Äußere Objekte sprechen mit dem Controller und nicht mit dem Kontrollierten. Das einzige Objekt, das in der Regel direkt mit einem UITableView sprechen soll, ist UITableViewController . Der Controller besitzt im Allgemeinen das gesteuerte Objekt und der Controller sollte mindestens so lange Lebensdauer haben wie der gesteuerte.

"Delegate" konzentriert sich auf Verhalten, Strategie und Beobachter. Ein Objekt fragt seinen Delegierten nach Hinweisen zu Verhaltensweisen (sollte ich diese Daten zeigen? Welche Farbe sollte das sein? Kann ich diese Aktion machen?). Ein Objekt sagt seinem Delegierten, wenn interessante Dinge passieren (ich wurde berührt. Ich bin dabei, etwas zu beenden. Ich hatte ein Problem.) Ein Delegierter der besonderen Art beantwortet Fragen von Daten (welche Daten gehen in Zeile 3?). Diese werden Datenquellen genannt.

Wo es für den Rest des Systems üblich ist, mit einem "Controller" zu sprechen, ist es im Allgemeinen nicht angemessen, mit einem "Delegierten" zu sprechen. So ist es zum Beispiel im Allgemeinen angebracht, einen Zeiger auf ein UITableViewController zu haben und es von anderen Stellen im System zu senden. Es ist nicht angebracht, einen Zeiger auf den Controller tableView ; Sie sollten durch den Controller arbeiten. Wenn Sie jedoch einen Zeiger auf ein Objekt haben, ist es normalerweise nicht sinnvoll, nach seinem delegate zu fragen. Wenn Sie müssen, haben Sie wahrscheinlich etwas falsch entworfen. (Das bemerkenswerteste Beispiel ist [[NSApplication sharedApplication] delegate] , was fast immer das Falsche ist, mit dem man reden kann. AppDelegate ist der Delegat der Anwendung, kein Abladeplatz für Globals.)

Wenn ein Objekt einen Controller hat, ist der Controller fast immer der Delegierte. Zu meinen obigen Regeln, für die Sie sprechen, wenn ein Objekt sowohl Controller als auch Delegat ist, ist es ein Controller.

Es ist möglich, dass ein einzelnes Objekt der Delegierte von mehreren Dingen ist, besonders wenn die meisten Dinge kurzlebig sind (zum Beispiel Alarmansichten). Es ist nicht ungewöhnlich für UIViewController delegiert zu ein paar Dinge.

    
Rob Napier 14.06.2011, 13:16
quelle
5
  
  1. Wenn Sie die Delegierten als separate Klassen beibehalten, ist der Code sauber und portabel. Sie können diese Delegiertenklassen für andere Zwecke wiederverwenden, indem Sie sie einfach kopieren und einfügen und kleinere Änderungen vornehmen.

  2.   
  3. Es hat den Vorteil, die Delegierten in der gleichen Klasse zu halten, um sie in separaten Klassen zu halten. Sie können einfach auf die privaten Variablen / Objekte in der Klasse zugreifen, was im ersten Fall nicht möglich ist.

  4.   
  5. Wenn Sie die Delegaten getrennt halten und einen Wert an die Hauptklasse übergeben möchten, müssen Sie möglicherweise einen anderen Delegaten erstellen :-) oder Beobachter hinzufügen, oder Sie müssen sie mit einigen Eigenschaften übergeben.

  6.   
    
EmptyStack 14.06.2011 12:30
quelle
1

Kurze Antwort: Ja, es ist sehr üblich, dass ein View-Controller der Delegierte einer Ansicht (oder mehrerer Ansichten) ist, die er verwaltet.

Beispiele: UITableViewController ist eine Klasse für die Verwaltung einer UITableView-Instanz und implementiert sowohl das Tabellenquellen-Delegate als auch das Tabellenansichts-Datenquellenprotokoll (eine Datenquelle ist nur eine andere Art von Delegaten). Ebenso wäre es natürlich, wenn ein View-Controller der Delegierte für eine Auswahlansicht, Suchleiste, ein Textfeld usw. ist.

Begründung: Sichten sollten eigentlich nicht wissen, woher die Daten kommen, von denen sie angezeigt werden, aber View-Controller tun dies. Daher ist es für sie selbstverständlich, Daten bereitzustellen und Entscheidungen über eine bestimmte Ansicht zu treffen sollte Verhalten. Das Gleiche kann für andere Arten von Objekten gelten, aber Sie müssen einen gesunden Menschenverstand verwenden. Die Anwendung hat ihr eigenes Delegiertenobjekt, das normalerweise für die Erstellung von mindestens einigen der View-Controller und oft auch des Datenmodells verantwortlich ist. Daher wäre es offensichtlich nicht sinnvoll, dass diese Rolle von einem View-Controller wiedergegeben wird.

    
Caleb 14.06.2011 13:40
quelle
0

Die beste Vorgehensweise hängt sowohl von den Anforderungen als auch vom Code ab. Die am häufigsten verwendete Methode ist MVC Pattern. Sie werden die Idee bekommen, sobald Sie es implementieren. Es gibt auch einige Entwurfsmuster, die Sie lesen können. Aber für iPhone bevorzuge ich MVC. Und für die Delegierten ja ist es die normale Praxis in Ziel-c, den Controller als Delegierten zu verwenden. Das Ziel-c ist so konzipiert.

    
Rahul Vyas 14.06.2011 12:19
quelle
0

Wenn Sie planen, Informationen an mehrere Teile Ihrer Anwendung zu senden, ist NSNotification eine gute Wahl (auch wenn es die Dinge für andere vielleicht etwas komplizierter macht).

In anderen Fällen ist die Zuordnung eines Delegaten zu einem Protokoll eine gute Wahl, um Dinge im Code klar und isoliert zu machen.

KVC ist auch eine weitere Möglichkeit, Interaktionen in Ihrem Code zu implementieren: Ссылка

Je nachdem, was Sie vorhaben, kann eine Lösung besser sein als eine andere. Am besten ist es, mit jeder Lösung zu spielen, um mehr über sie zu erfahren ... Sie wird Ihnen helfen, beim Entwerfen die richtige Entscheidung zu treffen deine nächste iOS-Anwendung!

    
Sylverb 14.06.2011 12:28
quelle
0

Hier gehe ich:

Angenommen, Sie haben eine Klasse A und eine andere B.

"a" ist das Objekt der Klasse A

In "a", wenn Sie B instanziieren, als "b" und übergeben Sie es selbst, dh "a"

Jetzt können Sie einfach die Methode dieser Variablen "a" auslösen, die Sie gerade an "b" übergeben haben, weil Sie Zugriff auf dieses Objekt haben. Aber die Verwüstung beginnt, wenn du mit Klasse B fertig bist und beginnst, "b" freizugeben. Jetzt wird wegen "a" der gesamte für "b" zugewiesene Speicher freigegeben, aber nicht freigegeben und wird verwickelt, solange "a" nicht freigegeben wird. Gott rette dich, wenn du die Instanziierung der Klasse B rekursiv verwendest.

Daher können Sie mit delegate alle gewünschten Methoden der Klasse A verwenden und sich auch weit von diesem Problem fernhalten.

    
ebersmoll 14.06.2011 14:01
quelle