Muss ich noch etwas über die Speicherverwaltung lernen, wenn Objective-C / Cocoa Garbage Collection enthält?

8

Also habe ich endlich meine Objective-C / Cocoa-Bücher entstaubt. Es stellt sich heraus, dass sie fast 7 Jahre alt sind! Wie wichtig sind in Objective-C 2.0 jetzt die Speicherbereinigung?

Wie viel Unterschied hat Garbage Collection gemacht?

    
revs 19.12.2008, 20:59
quelle

6 Antworten

9

Speicherverwaltung ist immer noch wirklich wichtig zu verstehen. Wenn Sie auf ein älteres Betriebssystem abzielen, müssen Sie Speicherverwaltung durchführen. Wenn Sie eine ältere Bibliothek verwenden, müssen Sie Speicherverwaltung durchführen. Wenn Sie auf die Core Foundation-Ebene wechseln, müssen Sie (möglicherweise oder auch nicht) Speicherverwaltung durchführen.

Wenn Sie für das iPhone programmieren, müssen Sie Speicherverwaltung durchführen.

Der Garbage Collector in Objective-C ist hervorragend - und wenn Sie ihn benutzen können, sollten Sie es auf jeden Fall sein - aber er deckt einfach noch nicht jede Programmiersituation ab.

    
Jim Puls 19.12.2008, 21:24
quelle
3

Einige Cocoa-Technologien, wie verteilte Objekte, PyObjC (die Python-Objective-C-Bridge) -Plugins und CoreImage (zumindest das letzte, was ich gehört habe; das wurde vielleicht behoben), spielen mit Garbage Collection nicht gut. Wenn Sie diese Technologien verwenden, müssen Sie weiterhin die herkömmliche Speicherverwaltung verwenden. Wie andere bereits gesagt haben, müssen Sie immer noch die herkömmliche Cocoa-Speicherverwaltung (Referenzzählung) verwenden, wenn Sie OS X 10.4 oder das iPhone in Ihrem Code unterstützen.

Auf der anderen Seite kann der neue GC sehr nett sein. Es ist jedoch kein kostenloses Mittagessen; Sie müssen immer noch die Semantik des GC-Systems, seine Muster und seine Grenzen verstehen ... genauso wie Sie es mit jeder Technologie tun.

Da viele Drittanbieter-Frameworks GC noch nicht unterstützen, ist es wahrscheinlich am besten, das Referenzzählsystem noch zu verstehen. Wenn Sie die einfachen Regeln für den Objektbesitz befolgen, die in Apples angegeben sind Speicherverwaltung Handbuch , Sie sollten immer in Ordnung sein.

    
Barry Wark 19.12.2008 21:33
quelle
3

Wenn Sie die iPhone-Plattform programmieren, müssen Sie Retain / Release wissen, da Cocoa Touch keinen GC hat.

Wenn Sie Core Foundation, Core Graphics, die meisten Core Services oder eine andere CF-basierte API verwenden möchten, müssen Sie retain / release wissen, da CF-abgeleitete Objekte standardmäßig nicht mit GCs versehen sind ( und Sie müssen sie ausdrücklich zur Abholung freigeben).

Wenn Sie eine der POSIX-APIs oder einen Teil der übrigen Kerndienste verwenden möchten, müssen Sie die Verwaltung von Zuweisungen / freiem Speicher kennen. Sie erhalten nicht einmal Referenzzählung. (Ausnahme: Icon-Dienste, die ebenfalls eine Referenzzählung haben. Aus Carbon hergestellte APIs sind ein Durcheinander.)

Also, mit einem Wort: Ja.

    
Peter Hosey 20.12.2008 01:54
quelle
2

Es kommt darauf an. Wenn Sie planen, 10.4-Benutzer zu ignorieren, müssen Sie sich keine Gedanken darüber machen. Aber Objective-C 2.0 ist nicht unter 10.4 und niedriger verfügbar. Sie müssen sich also immer noch Gedanken um die Speicherverwaltung auf diesen Plattformen machen.

Das heißt, Speicherverwaltung ist immer eine nützliche Fähigkeit, und es ist sowieso nicht das schwer in Cocoa, also ist es nicht eine schlechte Fähigkeit, sich daran zu halten.

    
mipadi 19.12.2008 21:21
quelle
2

Es lohnt sich wahrscheinlich, etwas über die Konzepte zu lernen, die das Cocoa-Speichermanagement unterstützen, da es in bestimmten Situationen immer noch nützlich ist. Das iPhone OS unterstützt beispielsweise keine Garbage Collection. Es kann andere Situationen geben, in denen es vorteilhaft ist, die manuelle Speicherverwaltung zu verwenden, und es ist nützlich, diese Wahl treffen zu können

    
cms 19.12.2008 21:25
quelle
1

Die exzellenten Speicherverwaltungskonzepte von Cocoa helfen Ihnen bei der allgemeinen Speicherverwaltung. Ich habe das Autorelease-Konzept in ein paar C ++ - Projekte kopiert und es hat super funktioniert. Apache und Subversion sind Beispiele für andere Software, die auch Autorelease verwendet.

Persönlich finde ich Zurückhaltung / Freigabe / Autorelease, um genau das richtige Maß an Abstraktion für mich zu sein. Es ist keine Magie, also wenn ich wirklich etwas Seltsames machen muss, ist es einfach. Auf der anderen Seite sind die Regeln so einfach, dass es zur zweiten Natur wird, bis zu dem Punkt, an dem man schließlich nicht mehr an Speicherverwaltung denkt, sondern einfach funktioniert.

Fügen Sie dazu die Tatsache hinzu, dass, wie oben erwähnt, nur der größte Teil von Cocoa Garbage Collection unterstützt, während Sie C schreiben. Daher muss jeder Code, den Sie schreiben und / oder nicht Cocoa verwenden, manuell verwaltet werden . Dazu gehören CoreAudio, CoreGraphics und so weiter.

(Ja, CF-Objekte funktionieren mit GC, aber nur, wenn Sie es explizit für jedes Objekt aktivieren, und ich fand es schwierig, die GC-CF-Regeln zu lernen)

Zusammenfassend: Ich benutze den Müllsammler nie selbst (und das einzige Mal, wenn ich das tat, war es sehr schmerzhaft, da ich C ++ und CG in der Mischung hatte), und soweit ich weiß, sind die meisten Cocoa-Codierer sehr verwendet, um / release / autoreelease und verwenden Sie das.

    
nevyn 21.12.2008 12:25
quelle