webentwicklung-frage-antwort-db.com.de

Erklärung von starkem und schwachem Speicher in iOS5

Ich bin neu in der iOS5-Entwicklung und verwende Objective-C. Ich habe Probleme, den Unterschied zwischen starkem und schwachem Speicher zu verstehen. Ich habe die Dokumentation und andere SO Fragen gelesen, aber sie klingen alle für mich identisch, ohne weitere Einsicht.

Ich lese die Dokumentation: Übergang zu ARC - es verweist auf iOS4-Bedingungen zum Beibehalten, Zuweisen und Freigeben; das verwirrt mich. Dann schaue ich in Open U CS193p, wo es stark und schwach unterscheidet:

Stark : "Lass das auf dem Haufen, bis ich nicht mehr darauf zeige"
Schwach : "Behalte dies bei, solange jemand anders stark darauf hinweist"

Sind die beiden Definitionen nicht identisch = Wenn der Zeiger nicht mehr auf ein Objekt zeigt, geben Sie den Speicher frei, der das Objekt enthält? Ich verstehe das Konzept von Zeigern, Heap, Zuweisung oder Freigabe von Speicher - aber was ist der Unterschied zwischen stark und schwach?

113
KMC

Der Unterschied besteht darin, dass ein Objekt freigegeben wird, sobald keine strong Zeiger darauf vorhanden sind. Auch wenn schwache Zeiger darauf zeigen, wird die Zuordnung des Objekts aufgehoben, sobald der letzte starke Zeiger weg ist, und alle verbleibenden schwachen Zeiger werden auf Null gesetzt.

Vielleicht ist ein Beispiel angebracht.

Stellen Sie sich vor, unser Objekt ist ein Hund und der Hund möchte weglaufen (freigegeben werden).

Starke Zeiger sind wie eine Leine am Hund. Solange Sie die Leine am Hund haben, rennt der Hund nicht davon. Wenn fünf Personen ihre Leine an einem Hund befestigen (fünf starke Zeiger auf einen Gegenstand), rennt der Hund nicht davon, bis alle fünf Leinen gelöst sind.

Schwache Zeiger dagegen sind wie kleine Kinder, die auf den Hund zeigen und sagen: "Schau! Ein Hund!" Solange der Hund noch an der Leine ist, können die kleinen Kinder den Hund immer noch sehen und sie werden immer noch darauf zeigen. Sobald sich jedoch alle Leinen gelöst haben, rennt der Hund davon, egal wie viele kleine Kinder darauf zeigen.

Sobald der letzte starke Zeiger (Leine) nicht mehr auf ein Objekt zeigt, wird die Zuordnung des Objekts aufgehoben und alle schwachen Zeiger werden auf Null gesetzt.

508
BJ Homer

Sind die beiden Definitionen nicht identisch?.

Absolut nicht. Der Hauptunterschied zwischen den beiden Definitionen, auf die Sie hingewiesen haben, ist der "solange jemand anders". Es ist das "jemand anderes", das wichtig ist.

Folgendes berücksichtigen:

__strong id strongObject = <some_object>;
__weak id weakObject = strongObject;

Jetzt haben wir zwei Zeiger auf <some_object>, eine starke und eine schwache. Wenn wir strongObject wie folgt auf nil setzen:

strongObject = nil;

Wenn Sie dann die von Ihnen festgelegten Regeln durchgehen, stellen Sie sich folgende Fragen:

  1. Stark: "Lass das auf dem Haufen, bis ich nicht mehr darauf zeige."

    strongObject zeigt nicht auf <some_object> nicht mehr. Wir müssen es also nicht behalten.

  2. Schwach: "Behalte das, solange jemand anders stark darauf hinweist"

    weakObject zeigt immer noch auf <some_object>. Da jedoch niemand sonst darauf hinweist, bedeutet diese Regel auch, dass wir sie nicht aufbewahren müssen.

Das Ergebnis ist, dass <some_object> wird freigegeben und wenn Ihre Laufzeitumgebung dies unterstützt (Lion und iOS 5 oder höher), wird weakObject automatisch auf nil gesetzt.

Nun überlegen wir, was passiert, wenn wir weakObject auf nil setzen:

weakObject = nil;

Wenn Sie dann die von Ihnen festgelegten Regeln durchgehen, stellen Sie sich folgende Fragen:

  1. Stark: "Lass das auf dem Haufen, bis ich nicht mehr darauf zeige."

    strongObject zeigt auf <some_object>. Also müssen wir es behalten.

  2. Schwach: "Behalte das, solange jemand anders stark darauf hinweist"

    weakObject zeigt nicht auf <some_object>.

Das Ergebnis ist, dass <some_object> ist nicht freigegeben, aber weakObject ist der nil Zeiger.

[Beachten Sie, dass alles, was angenommen wird <some_object> wird nicht durch einen anderen starken Verweis an einer anderen Stelle erwähnt/durch ein anderes Mittel, um "festgehalten" zu werden]

34
mattjgalloway

Stark

  1. Erzeugt Eigentum zwischen Eigentum und zugewiesenem Wert.
  2. Dies ist die Standardeinstellung für Objekteigenschaften in ARC, sodass Sie sich keine Gedanken über die Referenzzählung machen und die Referenz nicht automatisch freigeben müssen.
  3. Es ist ersatz für behalten. Wir setzen genau dann ein, wenn wir als Retain verwenden müssen.

Schwach

  1. Erzeugt Nicht-Eigentumsrechte zwischen dem Eigentum und dem zugewiesenen Wert.
  2. Strong wird für das übergeordnete Objekt verwendet und weak wird für das untergeordnete Objekt verwendet, wenn das übergeordnete Objekt freigegeben wird. Die Referenz auf das untergeordnete Objekt wird ebenfalls auf Null gesetzt
  3. Es hilft, Retentionszyklen zu verhindern.
  4. Das referenzierte Objekt wird beim Sammeln durch den Garbage Collector nicht geschützt.
  5. Schwache ist im Wesentlichen zugeordnet, Eigentum nicht beizubehalten.
2
Shashi3456643

Ein anderes Beispiel: Student ist ein Object, vorausgesetzt, er/sie kann einen Abschluss machen (deallocate), solange er/sie alle Grundkurse abgeschlossen hat (strong pointers), egal ob sie/er Wahlfächer belegt (weak pointers). Mit anderen Worten: Ein starker Zeiger ist der einzige Faktor für die Freigabe dieses Object.

2
rObOtAndChalie

Nein, sie sind nicht identisch, aber sehr unterschiedlich. Sie verwenden strong nur, wenn Sie das Objekt behalten müssen. Sie verwenden "schwach" in jedem anderen Fall, mit dem Vorteil, dass Sie wissen, ob das Objekt aus dem Haufen entfernt wurde, weil es von niemandem aufbewahrt wird.

1
Gabriel

Ich weiß, dass ich zu spät zu dieser Party komme, aber ich denke, es ist wichtig, das Problem zu verwirren, indem ich darauf hinweise, dass die Bedeutung von "starken und schwachen Speichermodellen" davon abhängt, ob Sie über Software oder Hardware sprechen.

Bei Hardware gibt "schwach" oder "stark" an, ob die sequentielle Konsistenz unterstützt wird.

[SC bedeutet, dass] ... das Ergebnis jeder Ausführung dasselbe ist, als ob die Operationen aller Prozessoren in einer sequentiellen Reihenfolge ausgeführt würden, und die Operationen jedes einzelnen Prozessors erscheinen in dieser Reihenfolge in der Reihenfolge, die von seinem Programm angegeben wird. - Lamport, 1979

WTF hat das mit Gedächtnis zu tun? Dies impliziert, dass das Schreiben in Variablen durch verschiedene Prozessoren von allen Prozessoren in derselben Reihenfolge gesehen werden muss. Bei Hardware mit einem starken Modell ist dies garantiert. Bei Hardware mit einem schwachen Modell ist dies nicht der Fall.

Bestehende Antworten interpretieren die Frage nur in Bezug auf Softwarespeichermodelle. Hardware ist für die Programmierung nicht irrelevant. In dieser Frage wird iOS erwähnt, das normalerweise auf Arm7-Prozessoren ausgeführt wird. Arm7 hat ein schwaches Gedächtnismodell. Für Programmierer, die an Prozessoren mit einem starken Modell gewöhnt sind - wir alle, weil x86 und x64 ein starkes Modell haben - ist dies eine schreckliche Falle. Das Verwenden eines Bool, um einem anderen Thread das Beenden zu signalisieren, funktioniert in einem starken Modell einwandfrei. Derselbe Code auf Arm funktioniert überhaupt nicht, es sei denn, Sie markieren das Flag als flüchtig, und selbst dann ist er fehlerhaft.

Zwar ändert Arm8 + dies durch die explizite Unterstützung von Erwerb/Freigabe vollständig, ältere Software verwendet diese Unterstützung jedoch nicht. Legacy-Software umfasst alle drei Telefonbetriebssysteme und alles, was auf ihnen ausgeführt wird, sowie Compiler und Bibliotheken, bis sie aktualisiert werden.

Für eine ausführliche Untersuchung dieses Themas verweise ich Sie auf das unnachahmliche Herb Sutter .

1
Peter Wone