Ich bin neu in der iOS5-Entwicklung und benutze Objective-C. Ich habe Probleme, den Unterschied zwischen starkem und schwachem Speicher zu verstehen . Ich habe die Dokumentation und andere SO-Fragen gelesen, aber alle klingen für mich ohne weitere Einsicht identisch.
Ich habe die Dokumentation gelesen : Übergang zu ARC - sie verweist auf iOS4-Bedingungen zum Speichern, Zuweisen und Freigeben; das verwirrt mich. Dann schaue ich in Open U CS193p, wo es stark und schwach unterscheidet:
Stark : "Behalte das auf dem Haufen, bis ich nicht mehr darauf zeige."
Schwach : "Behalte das, solange jemand anderes stark darauf zeigt."
Sind die beiden Definitionen nicht identisch = Wenn der Zeiger nicht mehr auf ein Objekt zeigt, geben Sie den Speicher frei, in dem sich das Objekt befindet? Ich verstehe das Konzept von Zeigern, Heap, Zuweisung oder Freigabe von Speicher - aber was ist der Unterschied zwischen stark und schwach?
Antworten:
Der Unterschied besteht darin, dass ein Objekt freigegeben wird, sobald keine starken Zeiger darauf vorhanden sind . Selbst wenn schwache Zeiger darauf zeigen, wird das Objekt freigegeben, 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 befestigt haben, rennt der Hund nicht weg. Wenn fünf Personen ihre Leine an einem Hund befestigen (fünf starke Zeiger auf ein Objekt), rennt der Hund nicht weg, bis alle fünf Leinen gelöst sind.
Schwache Zeiger hingegen 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 noch sehen und sie werden immer noch darauf zeigen. Sobald jedoch alle Leinen gelöst sind, rennt der Hund weg, 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.
quelle
Absolut nicht. Der Hauptunterschied zwischen den beiden Definitionen, auf die Sie hingewiesen haben, ist "solange jemand anderes". Es ist der "jemand anderes", der wichtig ist.
Folgendes berücksichtigen:
Jetzt haben wir zwei Hinweise
<some_object>
, einen starken und einen schwachen. Wenn wir setzenstrongObject
aufnil
so mag:Wenn Sie dann die von Ihnen beschriebenen Regeln durchgehen, stellen Sie sich folgende Fragen:
Stark: "Behalte das auf dem Haufen, bis ich nicht mehr darauf zeige."
strongObject
zeigt nicht<some_object>
mehr auf. Wir müssen es also nicht behalten.Schwach: "Behalte das, solange jemand anderes stark darauf hinweist"
weakObject
zeigt immer noch auf<some_object>
. Aber da sonst niemand darauf hinweist, bedeutet diese Regel auch, dass wir sie nicht einhalten müssen.Das Ergebnis ist, dass
<some_object>
die Zuordnung aufgehoben wird. Wenn Ihre Laufzeit dies unterstützt (Lion und iOS 5 aufwärts),weakObject
wird dies automatisch auf gesetztnil
.Betrachten wir nun , was passiert , wenn wir setzen
weakObject
aufnil
so mag:Wenn Sie dann die von Ihnen beschriebenen Regeln durchgehen, stellen Sie sich folgende Fragen:
Stark: "Behalte das auf dem Haufen, bis ich nicht mehr darauf zeige."
strongObject
zeigt auf<some_object>
. Also müssen wir es behalten.Schwach: "Behalte das, solange jemand anderes stark darauf hinweist"
weakObject
zeigt nicht auf<some_object>
.Das Ergebnis ist , dass
<some_object>
wird nicht aufgehoben, sondernweakObject
wird das seinennil
Zeiger.[Beachten Sie, dass auf alles, was angenommen
<some_object>
wird, nicht durch eine andere starke Referenz irgendwo anders / auf ein anderes Mittel zum "Halten" hingewiesen wird]quelle
UIApplication
Objekt? Das Innenleben von wird stark darauf verweisenUIKit
- aber darüber müssen Sie sich keine Sorgen machen.Stark
Schwach
quelle
Ein weiteres Beispiel: Der Student ist ein Student
Object
, von dem angenommen wird, dass er / sie seinen Abschluss machen kann (deallocate
), solange er / sie alle Kernkurse (strong pointers
) abgeschlossen hat, unabhängig davon, ob er / sie optionale Kurse belegt (weak pointers
). Mit anderen Worten: Ein starker Zeiger ist der einzige Faktor für die FreigabeObject
.quelle
Nein, sie sind nicht identisch, aber sehr unterschiedlich. Sie verwenden strong nur, wenn Sie das Objekt beibehalten müssen. Sie verwenden in jedem anderen Fall schwach, mit dem Vorteil, dass Sie wissen können, ob das Objekt vom Heap entfernt wurde, weil niemand es behält.
quelle
Ich weiß, dass ich ziemlich 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.
WTF hat das mit Gedächtnis zu tun? Dies bedeutet, dass Schreibvorgänge von verschiedenen Prozessoren in Variablen von allen Prozessoren in derselben Reihenfolge angezeigt werden müssen. Bei Hardware mit einem starken Modell ist dies garantiert. Auf Hardware mit einem schwachen Modell ist dies nicht der Fall.
Bestehende Antworten interpretieren die Frage nur in Bezug auf Software-Speichermodelle. 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 Speichermodell. Für Programmierer, die an Prozessoren mit einem starken Modell gewöhnt sind - was wir alle sind, weil x86 und x64 ein starkes Modell haben - ist dies eine schreckliche Falle. Die Verwendung eines Bools, um einem anderen Thread das Beenden zu signalisieren, funktioniert in einem starken Modell einwandfrei. Der gleiche Code auf Arm funktioniert überhaupt nicht, es sei denn, Sie markieren die Flagge als flüchtig, und selbst dann ist sie unberechenbar.
Zwar ändert Arm8 + dies durch ausdrückliche Unterstützung für Erwerb / Veröffentlichung 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 den unnachahmlichen Kräutersutter .
quelle