Absturz nach Memory Warning Level 1 trotz geringer Live Bytes

  • Absturz nach Memory Warning Level 1 trotz geringer Live Bytes

    Heyho,

    Ich habe folgendes Problem:
    Mein Programm läuft auf einem Iphone 4 und 3GS ohne Probleme , jedoch bekomme ich auf einem 3G nach kurzer Zeit eine Memory Warning Level 1.

    Das komische daran ist nun:
    1. die Live Bytes, die in Instruments angezeigt werden, sind weit von 10MB entfernt wenn die Warnung kommt.
    2. nach der Warning folgt der Absturz des Programms, allerdings aufgrund eines nun leeren Arrays, welches eigentlich nicht leer sein sollte.

    Wodurch also kann es überhaupt zu einer Warnung kommen bei den geringen Bytes? Und warum ist das Array plötzlich leer obwohl vorher die ganze Zeit damit gearbeitet wurde. In der Received Memory Warning Methode steht nichts drin , welches das Array löschen würde.
  • Hast du mal geschaut was Leaks sagt?

    Das Dein Array plötzlich leer ist, könnte daran liegen dass Du auf einen bereits freigegebenen Zeiger zugreifst. Das funktioniert solange nicht der Speicher knapp wird meist ganz gut. Um das zu testen gibt es Zombie.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Ja es gibt 4-5 kleine Leaks aber alle im Bytes Bereich.

    Und der Speicher des Arrays dürfte eben nicht leer sein, denn ein paar Runden (es handelt sich um ein Spiel) funktioniert es ja und auf dem 3GS und 4er bis jetzt noch gar nicht zu solch einem Problem gekommen.

    Aber zack, sobald die memory warning kommt, und ich was drücke, ist das array leer. Und ich meine sogar das es zufällig ist um welches Array es sich handelt, die Fehledermeldung kam schon an mehreren Stellen.

    Es kommt mir so vor, als würde in der Received Memory Warning Methode einfach alle Array gelöscht, aber es steht zu 100% nichts in diesen Methoden.
  • Wie bereits gesagt. Wenn eine Memory Warning kommt, kannst Du davon ausgehen, dass vorher alles freigebener Speicher gelöscht wurde. Das wird er normalerweise nicht unbedingt. Wenn Du also irgendwo auf Speicher zugreifst der bereits freigegeben wurde, dann merksts du das erstmal gar nicht solange nicht der Speicher knapp wird. Schau Dir das Zombie mal an. Eventuell wirft Dir das was aus

    BTW selbst wenn du nur ein paar Bytes Leaks hast, kann das deinen Memory Warning erzeugen. Nehmen wir mal an Du hast einen Speicher von 10000 Byte und brauchst davoin nun 4000 Byte an einem Stück für irgendwas, dann 1Byte und dann nochmal 4000 Bytes. Jetzt gibst Du die beiden 4000er frei, der 1 ist aber ein Leak. Nun hast du zwar 9999 Bytes frei, ein Versuch einen Speicher von 5000 Bytes zu bekommen würde aber fehlschlagen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Die Zombies werde ich nachher auf jeden Fall mal anschmeißen, das ist eine gute Idee.

    Dein Beispiel ist echt plausibel, aber ist es sehr wahrscheinlich, dass dieser Fall eintritt?
    Und würde er nicht eigentlich 5000 bytes nach den 4001. Byte bekommen?
  • crvchul schrieb:

    Die Zombies werde ich nachher auf jeden Fall mal anschmeißen, das ist eine gute Idee.

    Dein Beispiel ist echt plausibel, aber ist es sehr wahrscheinlich, dass dieser Fall eintritt?
    Und würde er nicht eigentlich 5000 bytes nach den 4001. Byte bekommen?


    Öhm ja, Rechenfehler. Nimm einfach 9000 Bytes als Max :)

    Und wie wahrscheinlich das ist hängt halt davon ab wieviel Speicher angefordert und wieder freigegeben wird. Wir hatten das früher mal bei einem Project, dass wir pro Sekunde über 10000 kleine Speicherblöcke angefordert und unterschiedlich wieder freigegeben haben. Da wäre so eine Fragmentierung fatal gewesen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)