2008-12-10 12 views
11

Wenn Sie ziemlich typischen Mac-Code in einer OS X 10.5 + Umgebung schreiben, was sind die Nachteile der Garbage Collection?Soll ich Objective-C-Speicherbereinigung beim Schreiben für 10.5+ verwenden?

Bis jetzt war alles, was ich geschrieben habe, entweder 10.4 kompatibel oder auf dem iPhone, also habe ich mich ziemlich gut mit Retain/Release beschäftigt, aber jetzt arbeite ich an einem größeren Projekt, das nur 10.5 ist. Ich frage mich, ob es irgendwelche Nachteile gibt, einfach weiterzugehen und den Objective-C 2.0 Garbage Collector zu verwenden.

Was denkst du?

Antwort

12

Wenn Sie neuen Cocoa-Code schreiben und auf Mac OS X 10.5 abzielen, verwenden Sie die Garbage Collection Objective-C.

Wenn Sie einen Code schreiben, die auch auf dem iPhone laufen müssen, können Sie schreiben und Test dass Code für beiden Modelle sehr leicht durch diesen Code in einem separaten Rahmen zu halten, es mit Eigentum zu schreiben -retain und -release verwenden und setzen Sie sowohl Ihr Framework als auch Ihr Unit-Test-Ziel dafür auf GC-unterstützt statt GC-only.

Xcode führt Ihr Komponententestpaket zweimal aus, einmal mit GC on und einmal mit GC off, und Ihr Framework wird in beiden Ausführungsmodellen verwendet. Wenn Sie diesen Modellcode schließlich auf das iPhone übertragen möchten, können Sie ihn in eine auf das iPhone ausgerichtete statische Bibliothek stellen oder direkt in Ihr iPhone-Projekt einbinden.

Unabhängig davon, ob Sie Ihren Code auf dem iPhone ausführen möchten, sollten Sie jedoch die Garbage Collection auf jeden Fall zielen, wenn Ihre Anwendung Leopard erfordert. Es wird die Entwicklung erleichtern, und der Objective-C-Garbage-Collector schneidet ziemlich gut ab.

2

Wenn es die Möglichkeit gibt, Ihre Anwendung auf das iPhone zu portieren, sollten Sie sie nicht verwenden.

Garbage Collection möglicherweise haben negative Auswirkungen auf die Leistung, wenn Sie spezielle Anwendungsfälle haben. Ohne GC haben Sie eine genaue Kontrolle über die Zerstörung des Objekts, was nicht der Fall GC World ist. In den meisten Projekten lohnt es sich, GC einzuschalten, da es weniger fehleranfällig und einfacher ist. In der Theorie kann die Speicherverwaltung ohne GC immer schneller sein als mit GC, jedoch ist dies in den meisten praktischen Anwendungen nicht der Fall (da GC normalerweise besser für den Menschen optimiert ist).

+0

In der Theorie könnte GC schneller sein! Das ist der Fall, wenn das System nicht den Speicher freigeben muss, bevor das Programm beendet wird - dann erhalten Sie eine schnellere Zuweisung (nur den nächsten Teil des Heaps) und verbringen nie Zeit mit der Freigabe von Speicher. – Kornel

+0

Ja, sicher. Aber theoretisch können Sie immer einen GC schreiben, der Ihr Gedächtnis in einer Nicht-GC-Umgebung verwaltet. ;) –

+0

nein, ein GC kann Speicher nicht wie ein Nicht-GC-System zurückgewinnen. Es weiß nie, wann es zurückfordern soll, bis es die Sammlung tut. Es ist möglich, eine Mischung aus beidem zu haben, die aus dem Heap zugewiesen wird und freigibt, wenn sie außerhalb des Gültigkeitsbereichs liegt (ähnlich dem Verwenden von() Konstrukten), aber nicht mit "reinem" GC. – gbjbaanb

2

Ich bevorzuge die Speicherverwaltung selbst, einfach weil ich diese Kontrolle gerne habe. Ich weiß aus Erfahrung in anderen Sprachen (C#), dass GC es nicht erlaubt, Speicherprobleme vollständig zu ignorieren, und das ist in Cocoa dasselbe mit schwachen Referenzen und Callbacks, die (void *) verwenden, wo das Objekt nicht explizit gehört durch ein anderes Objekt. Sie handeln im Grunde eine Reihe von Herausforderungen (Speicherlecks) für eine andere. Persönlich tendiere ich heutzutage nicht dazu, zu viele Speicherverwaltungsfehler zu machen, und diejenigen, die ich mache, sind ziemlich einfach zu finden.

Es gibt einige Situationen (z. B. Implementieren von Datenquellenmethoden für eine NSOutlineView, in der Sie das Objekt nicht für die Gliederungsansicht bereitstellen möchten), wo ich dachte, dass GC wirklich hilfreich wäre, aber ich habe Habe noch keine echten Tests damit gemacht.

Apple listet einige andere Vor- und Nachteile in der GC programming guide auf.

+4

Manuelle Speicherverwaltung ist eine vorzeitige Optimierung. – jrockway

+3

Er tut es nicht, um zu optimieren. – mk12

+0

Wollen Sie nicht sagen: "Speicherprobleme ignorieren, und das ist nicht das gleiche in Cocoa"? –

-1

GC ist ab Version 10.8 veraltet. Es war eigentlich nie eine gute Idee, diese Technologie anzunehmen, Cheerleading beiseite, weil Performance- und Stabilitätsziele nie erreicht wurden.

Das Verwalten des Speichers "manuell" ist eigentlich sehr einfach, weil der Verwaltungscode weitgehend ausgeklammert werden kann. Meine Codebasis hat < 1% Code im Zusammenhang mit Speicherverwaltung, und das ist größer als es sein muss. Ich bin also auch skeptisch gegenüber ARC, nur weil das Problem, das es löst, so klein ist, dass selbst kleine Fehler mit der Technologie es weniger als lohnenswert machen.

+1

Es ist nicht wahr, dass es * nie * eine gute Idee war. Beide Technologien haben das gleiche Ziel; Der Großteil des für beide geschriebenen Codes sieht gleich aus und sie sind konzeptionell gleichwertig, wenn es darum geht, eine Aufgabe als Eigentümer zu behandeln. Das Behandeln des Prozentsatzes des Speicherverwaltungscodes als Beweis seiner Leichtigkeit ist sehr ungenau. Mit steigendem Prozentsatz nimmt die Wahrscheinlichkeit eines Fehlers zu, aber es wird nur eine Zeile (oder eine fehlende Zeile) benötigt, um einen schwerwiegenden Speicherverwaltungsfehler einzuführen. –

+0

Gute Ziele zu haben macht nicht gerade eine gute Idee, denn die Straße zur Hölle ist mit guten Absichten gepflastert. GC hat einfach nie richtig funktioniert, weshalb es nie eine gute Idee war, sie zu übernehmen. In der Rechtfertigung von ARC beschrieb Chris Lattner die Mängel des GC: http://lists.apple.com/archives/objc-language/2011/Jun/msg00013.html Diese Mängel waren immer vorhanden, sie traten nicht plötzlich auf, sobald ARC eingeführt wurde . Dieser Ort ist zu kurz für Beweise, aber das gleiche Argument, das Sie für das Speichermanagement anwenden, gilt auch für den gesamten anderen Code. Ihr Argument ist also trivial. – mpw

+0

GC Mängel wurden dokumentiert; Das war nie in Frage. Die Gesamtzahl der Zeilen des Retain/Release-Codes ist als Argument zugunsten der manuellen Speicherverwaltung irrelevant, da nur ein Retain-Zyklus oder ein anderer zufälliger Fehler zur Einführung eines Fehlers erforderlich ist. Manchmal hängen wir aufgrund der Zeit, in der wir in sie investiert haben, an etwas, und wir werden neuen Dingen gegenüber misstrauisch. Ich glaube, dass das gegensätzliche idiomatische moderne Objective-C, das ARC verwendet, aus falschen Gründen auf der falschen Seite der Geschichte steht. –

Verwandte Themen