Gewusst wie: Debuggen von iOS-Absturz durch Arbeitsspeicher
Bin ich mit der ARC und die app stürzt ab, sagen empfangenen Speicher-Warnung.
Ich Teste die Anwendung direkt auf dem Gerät (iPhone 4 mit iOS 7.0.2) und kompiliert mit XCode 5 mit iOS 6 SDK.
Ich habe die apple-Instrumente und ich bin mit rund 20 MB LiveBytes zugeordnet.
Nach 4-5 min meine app hat 30 MB Speicher.
Nach dem kompilieren und testen der app auf dem Gerät, das ich sehen, dass Absturz nach wenigen Minuten, kurz nachdem der Speicher Warnung. Warum nicht passieren crash mit Instrumenten?
Ich bin jedoch versuchen, deaktivieren Sie dieses problem für einen Monat und kann nicht Sache Ritus, und ich brauche wirklich Hilfe.
Es sieht aus wie ich haben keine Lecks, aber ich kann nicht finden, wo ist falsch.
Vielen Dank im Voraus für jede Beratung.
Ich habe im wesentlichen das gleiche problem, vielleicht nach einer anderen Frage bald, wenn ich die Antwort nicht finden können anderswo.
Ich habe mein problem gelöst, meine Antwort.
InformationsquelleAutor andreapavan | 2013-10-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich das problem gelöst. In meinem Fall, die Speicher-Druck, es war durch den ständigen Speicher-Auslastung durch einen run loop-Zyklus. Die Schleife wird pro Sekunde ausgeführt und arbeitet auf den Daten, die analysiert werden müssen und präsentiert in Aussicht. Eine andere Sache, das Projekt war zunächst nicht mit der ARC. Nach einem Umbau-Projekt zu ARC aufgetreten ist das problem.
Bevor die Umsetzung des Projektes ARC, am Ende der Schleife hatte ich ein direkter Aufruf für die Freisetzung von Ressourcen. Mit ARC natürlich geschieht dies automatisch, und das problem ist nur, dass. Also für die Klasse, läuft die Schleife, kehrte ich zurück, um nicht von der ARC-version und ich habe die tricks, um manuell die Freigabe der Ressourcen, die ich verwendet.
Autorelease-pool-Blöcke bieten einen Mechanismus, wodurch Sie verzichten auf ein Objekt in Besitz, aber vermeiden Sie die Möglichkeit, es wird sofort freigegeben (wenn Sie ein Objekt wieder aus einer Methode). In der Regel, die Sie nicht brauchen, zu erstellen Sie Ihre eigenen autorelease-pool-Blöcke, aber es gibt einige Situationen, in denen entweder Sie müssen oder es vorteilhaft ist, dies zu tun.
Am Ende der autorelease-pool-block-Objekte erhalten, dass eine autorelease-Nachricht innerhalb des Blocks gesendet werden, eine Freigabe-Nachricht—Objekt erhält ein release-Nachricht für jedes mal, wenn Sie gesendet wurde, eine autorelease-Nachricht innerhalb des Blocks.
Sie können eine @autoreleasepool-block, um jeden Abschnitt des Codes, aber Sie sollten wirklich nicht tun, was ich denke dass du tust.
Autorelease ist viel weniger effizient als das ARC hinzufügen retain-und release-Aufrufe für Sie, und es ist potentiell unsicher. Autorelease legt alle Objekte in einem "pool" und dann, wenn Sie außerhalb des Gültigkeitsbereichs und/oder wenn er beschließt, die Müllkippe auf den pool, es "entwässert" der pool und die Objekte behalten zählt bekommen um eins verringert.
Die kurze Antwort: Lassen Sie sich die @autorelease Blöcke komplett, es sei denn, Apple sagt sonst, in der Dokumentation oder in der Vorlage (zum Beispiel main.m eine @autoreleasepool).
Dies bedeutet, dass Ihre Objekte erzielen könnten freigegeben werden, bevor Sie wirklich wollte. @autoreleasepool Blöcke sind nützlich, wenn Sie haben eine sehr enge Schleife der code, die gehen, um zu instanziieren, und dann verwerfen Sie eine massive Menge von Objekten. Zum Beispiel eine for-Schleife verarbeitet eine riesige Datenbank und ordnet die string-Objekte und verwendet dann diese string-Objekte zu füllen, die Eigenschaften der Instanzen einer Klasse, die Sie erstellt haben. In diesem Fall ARC kann nicht loslassen, diese Objekte zuverlässig, während Sie innerhalb der for-Schleife und möglicherweise müssen Sie erstellen Sie ein autorelease pool.
Aber ARC nicht das richtige zu tun in einer engen Schleife ist nicht sehr Häufig. Es ist wirklich mehr von einem nicht-ARC-Konzept, mit dem Sie einen NSAutoreleasePool und Sie manuell zu entleeren.
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html#//apple_ref/doc/uid/20000047-CJBFBEDI
Ich hoffe, ich habe geholfen, andere mit dem gleichen problem.
@autoreleasepool
s noch nützlich in BOGEN und nicht nur in engen loops. Ich habe gesehen@autorelease
helfen, mit memory-Druck Themen in meiner app, wenn es um große Speicher-I/O-Schlingen. Auch: stackoverflow.com/questions/9086913/...ich habe das gleiche Problem. ich habe 5k aufzeichnen von web-service, als ich bin das einfügen dieser alle Datensatzes an die db. Jedesmal, wenn 3k Datensatz erfolgreich eingefügt als app Abstürzen. Meine Schleife wird ausgeführt 5k Zeit, wie ich insert-5k aufnehmen. so ist es gut zu implementieren autoreleasepool-Methode in der Schleife ?
Mir war ein eher spezieller Fall, denn ich hatte, um meine Hände auf ein Projekt entwickelt sich in mehreren Schritten. Wie gesagt Shizam,autoreleasepools sind auch nützlich, wenn Sie ARC. In der Regel brauchen Sie nicht zu erstellen Sie Ihre eigenen autorelease-pool-Blöcke, aber es gibt einige Situationen, in denen Sie entweder oder müssen, ist es von Vorteil, dies zu tun. Ich hatte ein problem zwischen ARC und der block autoreleasepool. In der alten Implementierung wurde manuell abgewickelt, und ich hielt diese Art und Weise. Ich gemäß den Einstellungen, die die Klasse verwenden, die nicht mit BOGEN, und ich konnte den Speicher manuell mit einem block autoreleasepool, wo nötig.
Überprüfen Sie auch, diese tolle Antwort @mattjgalloway, bietet weitere details zu den Blöcken autoreleaspool ARC. stackoverflow.com/a/9087002/1056493
Ich habe die gleiche situation wie @Coder. Hast du eine Lösung für das @Coder?
InformationsquelleAutor andreapavan
InformationsquelleAutor Bhushan_pawar