Received memory warning. bei Download

  • Received memory warning. bei Download

    Hi,

    ich hab kurz ne Frage.
    In meiner App ist es Möglich große Mengen an Daten runter zu laden.
    Nun ist es so , dass nach einer Weile (ca 20 Minuten & ca 500 MB) immer wieder "Received memory warnings" kommen und kurz drauf
    stürzt die App dann auch ab.(Nur am iOS-Gerät im Simulator funktionierts ohne Warnung & Absturtz)

    Gibt es irgendwelche Richtwerte wie viel man auf einmal runter laden kann / soll ?
    Es sind viele einzelne Dateien die dann auch ins Dokumenten-VZ geschrieben werden...
    Und wie groß einzelne Dateien dann hächstens sein sollen? Sowohl Auflösung als auch Datengröße?

    Danke & Lg,
    Lena
  • Die Memory Warning kommt bestimmt auf Grund eines Speicherverwaltungsfehlers. Du wirst zwischen den Downloads wahrscheinlich nicht den Autoreleasepool verlassen und somit wird der Speicher immer voller.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Ok damit dass ich irgendwas wieder freigeben muss, hab ich mich in der Tat nicht beschäftigt...

    Die Dateien lade ich immer so runter:









    NSURL *url = [NSURL URLWithString: downloadFileField];

    NSData *pdfData = [[NSData alloc] initWithContentsOfURL:url];

    [pdfData writeToFile:filePath atomically:YES];


    Ich denke ich muss den Speicherplatz für pdfData dann wieder frei geben, oder ?
    Nur wie mache ich das? (Sorry für die Frage, aber das habe ich bisher noch nie gebraucht... )


    Danke & Lg, Lena
  • Am sichersten ist:

    Quellcode

    1. @autoreleasepool {
    2. NSURL *url = [NSURL URLWithString: downloadFileField];
    3. NSData *pdfData = [[NSData alloc] initWithContentsOfURL:url];
    4. [pdfData writeToFile:filePath atomically:YES];
    5. [pdfData release]; // Nur bei MRC
    6. }


    EDIT: Das hilft Dir aber wenig, wenn Du sehr große PDFs hast. Da musst Du dann mit NSURLConnection und NSOutputStream für die Dateien arbeiten.
    „Meine Komplikation hatte eine Komplikation.“
  • [pdfData release];
    geht nicht.
    Ich hab den Code jetzt aber mal ohne ausprobiert und da ist es das erste mal ohne Fehlermeldung durchgelaufen.


    Quellcode

    1. @autoreleasepool {
    2. NSURL *url = [NSURL URLWithString: downloadFileField];
    3. NSData *pdfData = [[NSData alloc] initWithContentsOfURL:url];
    4. [pdfData writeToFile:filePath atomically:YES];
    5. }


    Mein Problem scheint also gelöst zu sein ;-)
  • @macmoonshine & @Claus

    nö nö das stimmt schon damit sollte ich mich echt auseinandersetzen...

    Wenn jemand ne gute Idee wo ich mich da am besten rein lesen (ausser Apple selber, das find ich manchmal ein bisschen zu komplex ;-) ) kann dann immer her damit ... :-)

    Lg Lena
  • Das Thema Downloads hatten wir doch schonmal hier.

    Mit NSURLConnection hättest Du die Probleme wahrscheinlich nicht. -initWithContentsOfURL: (NSData) ist keine gute Wahl für Netzwerkverbindungen. Für kleine Sachen mag das ja notfalls noch gehen, ich würde sie nicht einmal dafür verwenden. Und 500 MB schreien das ganz laut nach "Mach' das ordentlich", auch wenn die klein gestückelt sind. Da kann alles Mögliche blockieren oder schief laufen und du läufst immer Gefahr, dass dich eine große Datei in die Speicherfalle zieht.

    Unabhängig davon erlöst dich das allerdings nicht von der Notwendigkeit, dich in die Grundlagen der Speicherverwaltung einzulesen. Die dürfte sowohl in Amins Buch als auch in dem von kmr und macmoonshine ausgiebig und verständlich erklärt werden (ich habe sie nicht, aber darauf würde ich wetten).
    Multigrad - 360°-Produktfotografie für den Mac
  • lena schrieb:

    Wenn jemand ne gute Idee wo ich mich da am besten rein lesen (ausser Apple selber, das find ich manchmal ein bisschen zu komplex ;) ) kann dann immer her damit ... :)

    Da gibt's mehrere Möglichkeiten, z. B.:
    Ein sehr unkonventioneller, schöner Ansatz: Speicherverwaltung zu Fuß (Link funktioniert leider momentan nicht; sehr schade)
    Ansonsten: Abschnitte 2.3 und 2.4

    ...oder bei Google ;)
    „Meine Komplikation hatte eine Komplikation.“