Meine App hat nicht mehr genügend Speicherplatz. Um dies zu beheben, gebe ich zwei sehr große Arrays frei, die in einer Funktion verwendet werden, die einen Framebuffer in ein Bild schreibt. Die Methode sieht folgendermaßen aus:
%Vor%Beachten Sie, dass die beiden am Ende frei (Puffer) und frei (Puffer2) sind? Diese funktionieren gut auf dem iPad-Simulator, entfernen das Speicherproblem und erlauben mir, mit Unverschämtheit zu erzeugen. Sie töten jedoch sofort das iPad. Wie zum ersten Mal es es ausführt. Wenn ich die free () -Aufrufe lösche, läuft alles gut, nach ein oder zwei Minuten ist der Speicher knapp. Warum bricht der free () Aufruf das Gerät ab?
Hinweis - es ist nicht der Aufruf von free (), der das Gerät explizit abstürzt, es stürzt später ab. Aber das scheint die Ursache zu sein /..
EDIT - Jemand hat gefragt, wo es genau abstürzt. Dieser Ablauf wird fortgesetzt, um das Bild an ein anderes Objekt zurückzugeben, das es in eine Datei schreibt. Beim Aufruf der Methode 'UIImageJPEGRepresentation' wird eine EXT_BAD_ACCESS-Nachricht generiert. Ich nehme an, dies liegt daran, dass die UIImage, die ich übergebe, um in die Datei zu schreiben, beschädigt, null oder etwas anderes ist. Aber das passiert nur, wenn ich diese beiden Puffer frei mache.
Ich würde verstehen, wenn der Speicher irgendwie mit der UIIMage zusammenhängt, aber das sollte wirklich nicht sein, besonders da es am Simulator funktioniert. Ich fragte mich, ob es darauf ankommt, wie das iPad "freie" Anrufe behandelt ...
Zuerst sollten Sie überprüfen, ob malloc fehlgeschlagen ist und NULL
zurückgegeben haben. Wenn dies jedoch Ihr Problem nicht löst, verwenden Sie einen Debugger und durchlaufen Sie Ihr Programm, um genau zu sehen, wo es fehlschlägt (oder zumindest eine Stack-Trace erhalten). Aus meiner Erfahrung sind seltsame Fehler wie der Absturz irgendwo in unerwarteten Bereichen fast immer Pufferüberläufe, die willkürliche Daten beschädigen.
Tags und Links c objective-c iphone memory-management free