Welche Probleme im Zusammenhang mit dem Arbeitsspeicher sollte ich als neuer Objective-C-Entwickler bei der Verwendung von ARC beachten?

8

Vor kurzem habe ich angefangen, in Objective-C für iOS 5 Geräte zu programmieren. Mein brandneues MacBook ist mit Xcode 4.2 und dem neuesten Mac & amp geladen; iOS-SDKs Bisher war es eine lustige Erfahrung, aber es gibt ein Problem, das ich mit dem aktuellen Stand der Dokumentation und der verfügbaren Bücher sehe.

Insbesondere verweisen die meisten Bücher (die noch nicht aktualisiert wurden) immer darauf, wie und wann Sie Ihren Speicher verwalten sollen. Das ist großartig, aber der aktuelle SDK / Compiler enthält automatische Referenzzählung und da ich dies für meine Projekte eingeschaltet lasse, habe ich keine Ahnung, was ich persönlich überwachen und verwalten sollte.

Ich komme aus einem C # -Hintergrund. Die Speicherverwaltung in C # (technisch, .NET) wird vollständig vom Framework-Garbage-Collector übernommen. Ich verstehe, dass ARC tatsächlich eine Compiler-Funktion ist, die automatisch den Kode der Kachelplatte hinzufügt, wo sie hingehört. Außerdem haben meine Versuche, herauszufinden, wo ich meine eigene Freigabe von Objekten verwalten soll, nur Compilerfehler verursacht, weil ARC sich darum kümmern will.

Ich muss noch einen Fall finden, in dem ich meine Objekte verwalten musste. Ich werde "faul", weil ich nicht weiß, was ich überwachen und freilassen soll, und ich bin völlig blind darüber, wie sich dieses Verhalten auf die Leistung meiner Anwendung auswirken könnte.

Was sollte ich bei Neubenutzern beachten, wenn ich ARC in meinen iOS-Projekten verwende? Ich habe ein paar Fragen bezüglich Speicherverwaltung und ARC hier gelesen, aber um ehrlich zu sein, sind sie nicht zu freundlich zu den neuen iOS-Entwicklern. Könnte jemand bitte eine vernünftige Liste mit Aufzählungszeichen geben, in der erklärt wird, welche Probleme und Probleme zu beachten sind, sowie ein fairer Leitfaden, wann Selbstmanagement des Gedächtnisses notwendig ist?

    
RLH 30.01.2012, 22:11
quelle

1 Antwort

13
  • Rundschreiben. Wenn Objekte co-abhängig sind, werden sie undicht. Sie müssen einige Referenzen als schwach markieren, und Instrumente können Ihnen dabei helfen, diese Referenzen zu finden. Diese Lecks werden nicht einmal als Lecks auftauchen, weil sie starke Bezüge zueinander haben.

  • Erstellen Sie die Autorelease-Pools @autorelease , um die Anzahl der Autorelease-Pools dort zu belassen, wo Sie viele automatisch freigegebene Objekte erstellen (direkt oder indirekt). Insbesondere sind Ihre Programme und Programme, von denen Sie abhängig sind, autorelease viele Objekte (ARC oder andere). Ein automatisch freigegebenes Objekt ist eines, das "in der Zukunft" veröffentlicht wird. Jedes Cocoa-Programm erwartet, dass ein Autorelease-Pool in jedem Thread vorhanden ist. Deshalb erstellen Sie einen neuen Pool, wenn Sie einen neuen Thread erstellen, und warum Sie einen in main erstellen. Die Pools funktionieren wie ein Stapel - Sie können Pools pushen und aufklappen. Wenn ein Pool zerstört wird, sendet er seine zurückgestellte Nachricht release an jedes Objekt, das er enthält. Dies bedeutet, dass wirklich große Schleifen mit vielen temporären Zuordnungen zu vielen Objekten führen können, auf die nur vom Pool verwiesen wird, und der Pool kann sehr groß werden. Aus diesem Grund führen Sie in einigen Fällen die Verwaltung von Pools direkt aus, um die Anzahl der Objekte zu minimieren, die darauf warten, freigegeben und freigegeben zu werden.

  • Verwenden Sie das richtige Bridging / Casting. Manchmal müssen Sie die Lebensdauern explizit verwalten. ARC behandelt die offensichtlichen Fälle, aber es gibt komplexe Fälle, in denen Sie Lebensdauern explizit verwalten müssen.

  • Bei Verwendung von malloc 'ed und new ' ed Zuweisungen sowie undurchsichtige Typen in 'Core'-APIs. ARC verwaltet nur NSObject -Typen. Sie müssen für diese Zuweisungen, Typen und die Schnittstellen mit diesen APIs die korrekte Ref-Zählung explizit freigeben, löschen und verwenden.

  • Befolgen Sie immer die NS-API-Namenskonventionen und Vermeiden Sie explizite Speicherverwaltung Attribute wo möglich .

  • Sie benötigen MRC natürlich, wenn Sie Quellen ohne ARC oder GC kompilieren. Dies ist häufig der Fall, wenn Sie mit anderen Bibliotheken / Codestellen arbeiten. Natürlich behandelt der Compiler Interaktionen korrekt, so dass Ihr ARC-Programm nicht leckt.

  • ARC behandelt am meisten von dem, was Sie benötigen, wenn Sie die richtige Benennung und den geschriebenen Stil verwenden, aber es wird noch ein paar andere Fälle geben. Glücklicherweise können Sie immer noch Leaks und Zombies ausführen, um diese Probleme zu lokalisieren, wenn Sie sie während der Entwicklung nicht bemerken.

justin 30.01.2012, 22:19
quelle