Ist es möglich, "Aufgrund eines Speicherfehlers beendet" zu debuggen?

78

An einem bestimmten (konsistenten) Punkt, an dem meine App ausgeführt wird, wird konsistent die xcode-Fehlermeldung angezeigt

Beendet aufgrund eines Speicherfehlers.

Ich kann den Code, der den Fehler verursacht, nicht finden, aber ich kann anhand von Haltepunkten feststellen, welcher Code sich in der Nähe des Fehlers befindet.

Der Fehler wird direkt nach der Rückgabe einer bestimmten Zelle in meiner Implementierung des

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

UITableViewDataSourceMethode delegieren. Ich kann bestätigen, dass eine gültige UITableViewCellMethode zurückgegeben wird , aber ich denke, dass es Zeitverschwendung wäre, diese gesamte Methode zu erklären und zu veröffentlichen. Ich vermute jedoch, dass dies durch eine schnelle, massive Speicherzuweisung verursacht werden könnte.

Es heißt definitiv Terminated due to memory error, kein Gedächtnisdruck.

Ich würde gerne wissen, was Botschaft wirklich bedeutet. Gibt es auch eine Möglichkeit, diese Nachricht zu debuggen? Es wird kein Absturzbericht generiert.

Ich benutze ARC und iOS 7.

Weihnachtsmann
quelle
1
Ich habe den gleichen Fehler in Xcode gesehen. Meine App stürzte ab, weil ich eine superhohe UIWebView (mehr als 20000 Pixel) erstellt habe. Ich konnte weder einen Absturzbericht finden noch einen Weg finden, um vor dem Absturz Speicherwarnungen zu erhalten.
Heath Borders
@HeathBorders Ich verwende auch eine UIWebview. Das ist sehr interessant. Ich muss die Höhe meiner überprüfen. Vielen Dank!
Weihnachtsmann
Dies ist ein häufiger Fehler bei diesen Komponenten. Die möglichen Ursachen sind: Irgendwie erzeugen Sie zu viele Zellen (überprüfen Sie Ihre Berechnungen), Ihre Zellgrößen sind falsch (wie beim Teilen durch 0, wodurch eine Nan erzeugt wird, die bei der Erstellung der Größe eine Art unendliche Zahl darstellt). oder auf einer Endlosschleife auftreten.
Pochi
@HeathBorders Jetzt bin ich interessiert zu wissen, auf welchem ​​Gerät Sie getestet haben?
Weihnachtsmann
Ich habe auf einem iPad3 getestet. Außerdem war meine UIWebViewnicht nur super groß, sondern auch super breit (30000px).
Heath Borders

Antworten:

56

Ich bekam diesen Fehler und konnte nicht verstehen, was los war.

Nach einigem Suchen fand ich heraus, dass ich vergessen hatte, Zombies zu deaktivieren.

Gehen Sie wie folgt vor, um die Funktion zu deaktivieren:

Wählen Sie das Bearbeitungsschema

Deaktivieren Sie "Zombie-Objekte aktivieren"

zirinisp
quelle
5
Wenn Zombies aktiviert sind, ist alles betroffen, da Objekte nicht freigegeben werden. Dies füllt den Speicher sehr schnell im Fall einer Tabellenansicht, in der viele Dinge zugewiesen und freigegeben werden. Definition von "Zombies aktivieren": Ersetzen Sie freigegebene Objekte durch ein "Zombie" -Objekt, das jeden Versuch, es zu verwenden, abfängt. Wenn Sie eine Nachricht an ein Zombie-Objekt senden, protokolliert die Laufzeit einen Fehler und stürzt ab. Sie können sich die Rückverfolgung ansehen, um die Anrufkette zu sehen, die den Zombiedetektor ausgelöst hat.
Zirinisp
2
Trotzdem stehe ich vor dem Problem. Bitte führen Sie mich.
Ich bin ein Lernender
Wie deaktivierst du Zombies?
Sam
12

Ich hatte das gleiche Problem . ("Aufgrund eines Speicherfehlers beendet") Ich hatte die vor allem Antworten ausprobiert, aber nichts funktionierte für mich. Dann debugge ich meinen Code und stelle fest, dass eine for-Schleife unendlich lange läuft, wobei jedes Mal Speicher einem Array mit dem Wert Null zugewiesen wird. Es verwendet 300 + MB, sodass dieser Fehler auftritt

Vielen Dank.

maanvender singh
quelle
Du hast mir Zeit gespart. Vielen Dank.
Saikiran K
7

Ich hatte genau das gleiche Problem. Ich dachte, es hätte dazu geführt, dass mein Programm einen Speicherverlust hatte oder zu viel Speicher verwendete. Ich benutze Instrumente und habe das Zuweisen von Profil und Programm gut funktioniert. Außerdem habe ich Programm für Gerät lange genug ausgeführt, und es funktioniert auch gut.

Ich benutze auch iPad 3rd Gen zum Debuggen, es könnte aufgrund der Verlangsamung des Geräts oder des Fehlers dazu führen, dass es nur Xcode ist und von einem Xcode-Problem ausgeführt wird. Nicht das Problem des Speicherverlusts oder der Zuordnung.

Wenn Sie mit Instrumenten und App auf dem Gerät selbst sicherstellen und arbeiten

Tomohisa Takaoka
quelle
Hmmm. Jeder, der an diesem Beitrag teilgenommen hat, hat auf dem iPad der 3. Generation getestet. Zufall?
Weihnachtsmann
Ich benutze nur das iPad der 3. Generation, daher bin ich mir noch nicht sicher. Heute habe ich iPad Mini Retina bestellt, damit ich diese nächste Woche nachweislich antworten kann;)
Tomohisa Takaoka
Ich bin gerade auf einem iPhone5S darauf gestoßen. Ich habe gerade den Tracking-Code von Google hinzugefügt und musste ihn von arm64 auf arm7 / 7s reduzieren, da Google beim Erstellen von arm64 nur langsam arbeitet. Ich hatte angenommen, dass dies eine arm64 / 7s-Sache war. Mit Sicherheit nicht nur ein iPad der 3. Generation. Ich hatte einen Fehler in __connection_block_invoke_2, der mir durch separate Suchanfragen mit möglicherweise zu viel Herunterladen und OOMing in Verbindung gebracht wurde. Schade um den Mangel an Stacktrace ....
Peter
Ich begegne ihm auf einem iPad mini der 2. Generation ( iPad4,4 ).
Slipp D. Thompson
3
Ich habe ein ähnliches Problem beim Herunterladen einer ganzen Reihe von Bildern mit NSURLSession. Simulator und Standalone-Gerät (iPhone 6) funktionieren einwandfrei. Bei Instrumenten sieht das Zuordnungsdiagramm ebenfalls glatt aus. Stürzen Sie auch nicht ab. Problem tritt auf, wenn ich Gerät an xCode angeschlossen habe. Unabhängig von der Build-Konfiguration (Debug oder Release). Endet immer mit dem Rätsel "Speicherfehler".
Neru
6

Ich habe Tesseract für OCR verwendet und als mein Zieltext gescannt wurde, sollte ein GIF abgespielt werden. Als das GIF zu spielen begann, gab es eine Speicherspitze von 70-80 MB auf 450 MB. Das Problem war, dass GIF zu viel Speicher beanspruchte, die App abstürzte und Xcode diese Nachricht anzeigte. Also habe ich die betroffene imageView aus der Übersicht des ViewControllers entfernt.

imageView.removeFromSuperview

Danach würde die App immer noch auf 450 MB ansteigen, dann aber sofort freigegeben und auf 40 MB reduziert

Yash Tamakuwala
quelle
1
Ich habe 2 Tage damit verbracht, meinen Speicherabsturz zu beheben. Ihre Lösung hat geholfen. Vielen Dank..!
Aleesha
4

Gerät neu starten hat bei mir funktioniert. Die Meldung "Aufgrund eines Speicherfehlers beendet" wurde nicht mehr angezeigt.

Ofir Malachi
quelle
2

Bearbeiten Sie das Schema. Unter Diagnose finden Sie verschiedene Optionen zum Schutz der Zuordnungen. Einzelheiten finden Sie in der Dokumentation .

Die Frage ist: Sagt es wirklich "wegen Speicherfehler beendet" und nicht "Druck"? Checken Sie Instrumente ein, wenn Ihre App nur noch wenig Arbeitsspeicher hat. Wenn die App scheinbar nur noch wenig Arbeitsspeicher hat, sollten Sie sich darauf konzentrieren, unabhängig von der genauen Meldung.

LearnCocos2D
quelle
1
Es heißt definitiv "Fehler", nicht "Druck". Die Speicherebene liegt zum Zeitpunkt des Absturzes konstant bei etwa 15 MB.
Weihnachtsmann
Versuchen Sie es dann mit aktivierter Malloc-Diagnose. Übrigens testen Sie auf einem Gerät?
LearnCocos2D
0

Mit Xcode 11 wurde mein Projekt im DebugModus gestartet . Ich mache einige Bildaufnahmen / bearbeite / kehre zum Benutzer zurück und das ist nichts, was du verwenden kannst Debug. Sobald ich in den ReleaseModus wechselte, lief alles gut.

impression7vx
quelle
0

Ich habe mich dieser Art von Problem aufgrund von Unaufmerksamkeit gestellt.

Ich habe eine Funktion aufgerufen, die imageView als Unteransicht hinzufügt in:

override func layoutSubviews() {
    super.layoutSubviews()
}

Dies verursachte eine enorme Speichernutzung. Achten Sie also auf diese Art von Dingen!

Emma Vahradyan
quelle
0

Ich hatte ein ähnliches Problem in Xcode 11.3, bei dem die Kamera jedes Mal anrief, wenn wir auf die Schaltfläche "Erneut versuchen" klicken.Wenn dies mehrmals durchgeführt wird, kommt es zu einem Absturz.

Dies wurde behoben, als wir Zombie-Objekte deaktivierten. Unten sind Schritte:

  1. Tippen Sie oben links auf den Projektnamen. Dies zeigt eine Liste der im Projekt vorhandenen Ziele.
  2. Tippen Sie auf Schema bearbeiten

Screenshot-1

  1. Wählen Sie die Option Ausführen -> Diagnose -> Deaktivieren Sie Zombie-Objekte.

Screenshot-2

Führen Sie nun Ihr Projekt aus. Es sollte gut funktionieren.

Jayprakash Dubey
quelle
0

Was mir aufgefallen ist, ist, dass ich diesen Fehler auch bekomme, wenn ich meine App über ein Kabel auf dem Gerät laufen lasse und es für eine lange Zeit im Leerlauf lasse.

Apple spricht dies an und es könnte sein, dass die App im Leerlauf ist und sie einfach beendet.

Cyrus Zei
quelle
0

Ich habe diesen Fehler erhalten, weil ich einer collectionView-Zelle mit einer Größe von 40 x 40 Fotos in voller Größe hinzugefügt habe. Lesen Sie die 2 Kommentare unter der Frage von @matt. Ich musste die Bilder verkleinern, bevor ich sie der Zelle hinzufügte.

Lance Samaria
quelle