Brauche Hilfe - Memory Management von xib und images

  • Man korrigiere mich falls ich mich irre, aber:

    Folgender Code (natürlich extrem verienfacht) wäre durchaus denkbar in einem Hintergrundthread z.B um irgendwelche Bilder als Diashow anzuzeigen:

    Quellcode

    1. for(int i=0;i<1000;i++)
    2. {
    3. UIImage *image= [UIImage imageNamed:@"egal"];
    4. // hier das image anzeigen
    5. }


    würde aber zu einem tierischen Speicherverbrauch führen, da der Autorelease Pool nicht gelöscht werden kann innerhalb der Schleife.

    ein

    Quellcode

    1. for(int i=0;i<1000;i++)
    2. {
    3. UIImage *image= [UIImage allloc] initWith... ];
    4. // hier das image anzeigen
    5. [image release];
    6. }


    würde den Speicher aber schon in der Schleife wieder zur Verfügung stellen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • gritsch schrieb:

    du willst in einem thread bilder anzeigen?


    Ist das jetzt nicht egal, ob ich Bilder anzeige, Datensätze auslese oder sonst einen Scheiß mache ? Es geht immer um das gleiche Prinzip.
    Aber lass einfach gut sein, Ich mache es weiter so wie ich es für richtig halte und du so wie du. Solange ich weiß, daß meine Apps nicht den Speicher zumüllen und nicht einen Byte speicher fressen kann ich nicht soviel falsch machen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Thallius schrieb:

    gritsch schrieb:

    du willst in einem thread bilder anzeigen?


    Ist das jetzt nicht egal, ob ich Bilder anzeige, Datensätze auslese oder sonst einen Scheiß mache ? Es geht immer um das gleiche Prinzip.
    Aber lass einfach gut sein, Ich mache es weiter so wie ich es für richtig halte und du so wie du. Solange ich weiß, daß meine Apps nicht den Speicher zumüllen und nicht einen Byte speicher fressen kann ich nicht soviel falsch machen.

    Gruß

    Claus


    das problem ist aber meist dass es nicht um eine einzige variable geht die man dann auch wieder releasen muss. es geht meist um mehrer und wenn du ein release vergisst oder eines zuviel machst dann hast du ein speicherloch das vom system net behoben werden kann oder gar einen crash.
    Auch legen viele methoden die du aufrufst INTERN viele autoreleaste objekte an, an die du mittels release nie rankommst. wenn du in einre schleife also was machst und findest dass dort zuviel speicher verbraucht wird, dann mach doch einen eingen autorelease-pool den du alle X durchläufe leerst! dann hast du den GANZEN müll entsorgt, nicht nur das eine objekt um das du dich selbst kümmerst ;)
  • Thallius schrieb:

    würde aber zu einem tierischen Speicherverbrauch führen, da der Autorelease Pool nicht gelöscht werden kann innerhalb der Schleife.

    Da stecken mindestens drei Fehler drin:
    1. Wenn der Bildname immer gleich ist, erzeugt die Schleife genau ein Bild.
    2. Der meiste Speicherplatz wird von den Bilddaten belegt und nicht vom UIImage-Objekt. Die Bilddaten (CGImageRef) werden als contents an den Layer gehängt. Da hilft Dein release überhaupt nichts.
    3. Die Begründung von gritsch.
    4. Wenn Du so viele Bilder auf einmal anlegst, hast Du einen logischen Fehler im Programm.
    „Meine Komplikation hatte eine Komplikation.“