iPhone - dequeueReusableCellWithIdentifier Verwendung
Ich arbeite an einer iPhone-app, die hat eine ziemlich große UITableView mit Daten aus dem web, so bin ich versucht, zu optimieren Ihrer Erstellung und Nutzung.
Fand ich heraus, dass dequeueReusableCellWithIdentifier
ist ziemlich nützlich, aber nachdem ich viele source-codes, die mit diesem, Frage ich mich, ob der Gebrauch mache ich von dieser Funktion ist der gute.
Hier ist das, was Menschen normalerweise tun:
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"];
//Add elements to the cell
return cell;
Und hier ist die Art, wie ich es gemacht habe:
//The cell row
NSString identifier = [NSString stringWithFormat:@"Cell %d", indexPath.row];
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell != nil)
return cell;
cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:identifier];
//Add elements to the cell
return cell;
Der Unterschied ist, dass die Menschen verwenden den gleichen Bezeichner für jede Zelle, also dem entfernen eines nur vermeidet, alloc eine neue.
Für mich der Punkt, der Schlange war, daß jede Zelle eine eindeutige id, so dass, wenn die app fragt für eine Zelle ist es schon angezeigt, weder Zuordnung noch element hinzufügen müssen gemacht werden.
In Ordnung ich weiß nicht was am besten ist, das "gemeinsame" Methode ceils die Tabelle ist die Speichernutzung für die genaue Anzahl der Zellen angezeigt, während die Methode, die ich verwenden, scheint zu bevorzugen, die die Geschwindigkeit, wie es hält alle berechneten Zellen, können aber zu großen Speicherbedarf (es sei denn, es gibt eine innere Begrenzung für die Warteschlange).
Irre ich mich, es zu benutzen auf diese Weise? Oder ist es nur dem Entwickler, je nach seinen Bedürfnissen?
InformationsquelleAutor der Frage Jukurrpa | 2010-05-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zweck der
dequeueReusableCellWithIdentifier
zu verwenden weniger Speicher. Wenn der Bildschirm passen 4 oder 5 Zellen der Tabelle, dann mit der Wiederverwendung müssen Sie nur 4 oder 5 Zellen der Tabelle zugeordnet im Speicher, auch wenn der Tisch hat 1000 Einträge.In der zweiten Weise gibt es keine Wiederverwendung. Es gibt keinen Vorteil in den zweiten Weg nur mit einem array von Zellen der Tabelle. Wenn Ihre Tabelle hat 1000 Einträge, dann haben Sie 1000 Zellen zugeordnet im Speicher. Wenn Sie gehen zu tun, würde man Sie in ein array und nur der index des array mit der Zeilennummer und die Rückkehr der Zelle. Für kleine Tabellen mit festen Zellen, die möglicherweise eine sinnvolle Lösung für dynamische oder großen Tabellen ist es nicht eine gute Idee.
InformationsquelleAutor der Antwort progrmr
Als für die Zell-id - Anstatt nur mit "Zelle", der für den Bezeichner, und statt der Verwendung einer eindeutigen Kennung, wie der OP, konnte verwenden Sie ein "Typ-id"? Zum Beispiel, wenn mein Tisch hatte 3 Arten von Zellen, die mit einem sehr komplizierten sub-layout, mit gerade
Style1
und eine mitStyle2
sollte ich erkennen, dass diese drei alle separat und dann einfach neu zu erstellen, wenn dequeue kommtnil
.Beispiel:
(Dieser code wird wahrscheinlich nicht laufen, weil, ich schrieb es hier, aber hoffentlich bekommen Sie die Idee. )
Glaube ich nicht, Apple hätte das ganze wiederverwendbare Zelle, die Idee mit Bezeichner, wenn Sie wollten, alle Bezeichner werden
"cell"
meinst du nicht?InformationsquelleAutor der Antwort Tim
In der Dokumentation, die mir geholfen zu verstehen, warum die idiomatischen Weg (die, die Sie zuerst beschrieben) funktioniert am besten war UITableViewCell Klasse Referenz Abschnitt auf der
initWithStyle:reuseIdentifier:
Methode.Den
reuseIdentifier
Unterabschnitt liest:Und die "Diskussion" Unterabschnitt liest:
Diese Aussagen machen es mir klar, dass die idiomatischen Weise zu verwenden
dequeueReusableCellWithIdentifier
innerhalb Ihrer Implementierung vontableView:cellForRowAtIndexPath:
für IhreUITableViewDataSource
erstellt ein cell-Objekt für jede sichtbar Zeile unabhängig von der gesamten Anzahl von Zeilen zur Verfügung.InformationsquelleAutor der Antwort Jeff
Ich denke, der erste ist der beste (und, wie Sie sagte gemeinsamen) Weg zur Implementierung eines
UITableView
.Mit Ihrer zweiten Möglichkeit wird es sein Speichers, der für jede neue Zelle, die angezeigt wird, und kein Speicher wiederverwendet werden kann.
InformationsquelleAutor der Antwort AlexVogel
UITableView
intern verwendet, eine Zelle mit einer Kennung als "Vorlage". Also das nächste mal, wenn Sie Lesen (als Tabelle) versuchen, deque, sondern erstellt nur eine neue Zelle, aber mit der gespeicherten Objekt als Vorlage. Daher haben Sie immer noch aktualisieren Sie Ihre Benutzeroberfläche entsprechend der Inhalt der Zelle als pro Kontext.Dies bedeutet auch, dass die
UITableView
tut das Speicher-management der Zellen für uns per se. In der Theorie, es werden nur so vieleUITableViewCell
Objekte so viele wie die sichtbaren Zellen. Aber praktisch, es gibt vielleicht ein paar mehr zu warten, bis der Speicher freigegeben.Diese im Grunde spart Speicher big time, esp in Szenarien, in denen Sie 1000 Zellen.
Auf jedem tragbaren Gerät, wo der Speicher an einer Prämie ist, sollten wir verschieben die Zuordnung der Speicher zu den letzten, möglichen moment und lassen Sie es in dem moment sein job ist getan.
dequeAndReusing
eine Zelle erreicht dies und das tut es ziemlich gut.Auf der anderen Seite, wenn Ihr Handy eine benutzerdefinierte Zelle, dann könnten wir wahrscheinlich laden Sie eine Mine und extrahieren daraus.
Ist dies der Fall, können Sie entweder einen Bezeichner, deque ODER laden Sie es aus dem Halter. Es gibt keinen Unterschied in der Vorgehensweise.
Der einzige Unterschied könnte in der Ladezeit. So dass die Tabelle-Ansicht zum erstellen einer neuen Zelle mit dem Bezeichner der Zelle als Vorlage könnte geringfügig schneller als das laden aus der Feder, aber es ist kaum spürbar und hängt vom Kontext ab.
InformationsquelleAutor der Antwort Deepak G M
Unterscheiden Zelle von anderen Zellen, die Sie verwenden können tag-Eigenschaft der Zelle oder wenn Sie mithilfe der benutzerdefinierten Zelle dann sehr leicht durch Einführung einer neuen Eigenschaft, um benutzerdefinierte Zelle, während die Unterklassen
UITableViewCell
.Obwohl nach allen diesen Sie stecken geblieben sind und immer noch brauchen, um die Zelle, dann können Sie versuchen, folgenden code
UITableViewCell *cell = [self cellForRowAtIndexPath:indexPath]
in der Erwägung, dass es vermieden werden sollte, bis zu Umfang, da es produziert die Kopie der Zelle, aber nicht wieder die bestehenden Zelle, in der Erwägung, dass der Inhalt der gleiche Werte.
InformationsquelleAutor der Antwort Nikita Sharma Sahu