Speicherproblem mit CALayers?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Speicherproblem mit CALayers?

    Hallo alle zusammen,

    mein Programm läuft in der Regel sehr flüssig, nur habe ich mit der "Aufwertung" meiner einzelnen Views noch Schwierigkeiten. Mit folgendem Code versuche ich mittels CALayers meine UIViews zu verschönern:

    Quellcode

    1. CALayer *layer = [[CALayer layer] retain];
    2. detailcell.layer.borderColor = [UIColor grayColor].CGColor;
    3. detailcell.layer.borderWidth = 2;
    4. detailcell.layer.shadowColor = [UIColor blackColor].CGColor;
    5. detailcell.layer.shadowOpacity = 1.0;
    6. detailcell.layer.shadowRadius = 5.0;
    7. detailcell.layer.shadowOffset = CGSizeMake(0, 3);
    8. detailcell.layer.cornerRadius = 20;
    9. detailcell.clipsToBounds = NO;
    10. [layer release];


    Nur leider verursacht dieser kleine Code rießen Speicherprobleme und ich bekomme regelmäßig Memory Warnings. Hat jemand eine Idee was ich falsch mache? das Layer wird doch released? Eigentl. dürfte ja das bisschen Schatten etc nicht den ganzen Speicher meines Ipads/Iphones belasten :P

    Vielen Dank schon einmal für Hilfe,

    Gruß Hummer
  • Hummer schrieb:

    Hallo alle zusammen,

    mein Programm läuft in der Regel sehr flüssig, nur habe ich mit der "Aufwertung" meiner einzelnen Views noch Schwierigkeiten. Mit folgendem Code versuche ich mittels CALayers meine UIViews zu verschönern:

    Quellcode

    1. CALayer *layer = [[CALayer layer] retain];
    2. detailcell.layer.borderColor = [UIColor grayColor].CGColor;
    3. detailcell.layer.borderWidth = 2;
    4. detailcell.layer.shadowColor = [UIColor blackColor].CGColor;
    5. detailcell.layer.shadowOpacity = 1.0;
    6. detailcell.layer.shadowRadius = 5.0;
    7. detailcell.layer.shadowOffset = CGSizeMake(0, 3);
    8. detailcell.layer.cornerRadius = 20;
    9. detailcell.clipsToBounds = NO;
    10. [layer release];


    Nur leider verursacht dieser kleine Code rießen Speicherprobleme und ich bekomme regelmäßig Memory Warnings. Hat jemand eine Idee was ich falsch mache? das Layer wird doch released? Eigentl. dürfte ja das bisschen Schatten etc nicht den ganzen Speicher meines Ipads/Iphones belasten :P

    Vielen Dank schon einmal für Hilfe,

    Gruß Hummer


    Wo machst Du:

    Quellcode

    1. [myView layer addSublayer: layer];
    ?
    I would be embarrassed if they did not spy on me.
  • also das "retain" und "release" bzw. die ganze erste und letzte Zeile habe ich erst später hinzugefügt als ich versucht hatte das Problem zu lösen, denn dies stand auf mehreren Seiten die ich per google über das Problem finden konnte, aber geholfen hats leider nicht :( Aber schaden kanns ja auch nicht.

    Und [myView layer addSublayer: layer] benötige ich doch garnicht da detailcell ja mein UIView ist, ich also die Properties direkt veränder, oder? Denn die Effekte erscheinen ja auch wie gewollt.
  • longW schrieb:

    Dann kannst Du ja den kompletten Layer weglassen, wenn Du ihn nicht brauchst.
    Ansonsten setze den -neuen- Layer mit Deinen Werten, und füge ihn hinzu.

    wie meinst du das? Also ich habe jetzt in meinem Code die erste Zeile (mit der definition von layer) und die letzte mit layer release weggelassen, was aber nichts an dem Speicherproblem löst. Zur veranschaulichung, ich habe 3 UIViews nebeneinander, welche alle diesen Schatten und die "Runden Ecken" haben sollen. Mit dem ersten Code-Schnipsel erscheint dies zwar, jedoch wird das Programm sehr sehr langsam und manchmal stürzt es aufgrund von Speichermangel auch ab.
  • Hummer schrieb:

    longW schrieb:

    Dann kannst Du ja den kompletten Layer weglassen, wenn Du ihn nicht brauchst.
    Ansonsten setze den -neuen- Layer mit Deinen Werten, und füge ihn hinzu.

    wie meinst du das? Also ich habe jetzt in meinem Code die erste Zeile (mit der definition von layer) und die letzte mit layer release weggelassen, was aber nichts an dem Speicherproblem löst. Zur veranschaulichung, ich habe 3 UIViews nebeneinander, welche alle diesen Schatten und die "Runden Ecken" haben sollen. Mit dem ersten Code-Schnipsel erscheint dies zwar, jedoch wird das Programm sehr sehr langsam und manchmal stürzt es aufgrund von Speichermangel auch ab.

    Lies noch einmal den Beitrag von 'macmoonshine': Wozu?

    Du erzeugst einen Layer, benutzt ihn nicht, und gibst ihm dann ein "release".
    Stattdessen rackerst Du Dich mit dem 'detailcell.layer" ab.
    Wozu?
    I would be embarrassed if they did not spy on me.
  • longW schrieb:

    Hummer schrieb:

    longW schrieb:

    Dann kannst Du ja den kompletten Layer weglassen, wenn Du ihn nicht brauchst.
    Ansonsten setze den -neuen- Layer mit Deinen Werten, und füge ihn hinzu.

    wie meinst du das? Also ich habe jetzt in meinem Code die erste Zeile (mit der definition von layer) und die letzte mit layer release weggelassen, was aber nichts an dem Speicherproblem löst. Zur veranschaulichung, ich habe 3 UIViews nebeneinander, welche alle diesen Schatten und die "Runden Ecken" haben sollen. Mit dem ersten Code-Schnipsel erscheint dies zwar, jedoch wird das Programm sehr sehr langsam und manchmal stürzt es aufgrund von Speichermangel auch ab.

    Lies noch einmal den Beitrag von 'macmoonshine': Wozu?

    Du erzeugst einen Layer, benutzt ihn nicht, und gibst ihm dann ein "release".
    Stattdessen rackerst Du Dich mit dem 'detailcell.layer" ab.
    Wozu?
    Das ist doch eigentl. immer noch kürzer als folgendes zu schreiben:

    Quellcode

    1. CALayer *layer1 = [CALayer layer];
    2. layer1.frame = detailcell.bounds;
    3. layer1.borderColor = [UIColor grayColor].CGColor;
    4. layer1.borderWidth = 2;
    5. layer1.shadowColor = [UIColor blackColor].CGColor;
    6. layer1.shadowOpacity = 1.0;
    7. layer1.shadowRadius = 5.0;
    8. layer1.shadowOffset = CGSizeMake(0, 3);
    9. layer1.cornerRadius = 20;
    10. detailcell.clipsToBounds = NO;
    11. [detailcell.layer insertSublayer:layer1 atIndex:0];
    Alles anzeigen

    (Was übrigens genauso funktioniert.)
    Und ja du hast recht, wie es im Anfangs-Thread steht ist es sinnlos.
    Nun bleibt aber immer noch das Speicherproblem offen, oder verstehe ich das mit den layern noch nicht richtig?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Hummer ()

  • Hummer schrieb:

    longW schrieb:

    Hummer schrieb:

    longW schrieb:

    Dann kannst Du ja den kompletten Layer weglassen, wenn Du ihn nicht brauchst.
    Ansonsten setze den -neuen- Layer mit Deinen Werten, und füge ihn hinzu.

    wie meinst du das? Also ich habe jetzt in meinem Code die erste Zeile (mit der definition von layer) und die letzte mit layer release weggelassen, was aber nichts an dem Speicherproblem löst. Zur veranschaulichung, ich habe 3 UIViews nebeneinander, welche alle diesen Schatten und die "Runden Ecken" haben sollen. Mit dem ersten Code-Schnipsel erscheint dies zwar, jedoch wird das Programm sehr sehr langsam und manchmal stürzt es aufgrund von Speichermangel auch ab.

    Lies noch einmal den Beitrag von 'macmoonshine': Wozu?

    Du erzeugst einen Layer, benutzt ihn nicht, und gibst ihm dann ein "release".
    Stattdessen rackerst Du Dich mit dem 'detailcell.layer" ab.
    Wozu?
    Das ist doch eigentl. immer noch kürzer als folgendes zu schreiben:

    Quellcode

    1. CALayer *layer1 = [CALayer layer];
    2. layer1.frame = detailcell.bounds;
    3. layer1.borderColor = [UIColor grayColor].CGColor;
    4. layer1.borderWidth = 2;
    5. layer1.shadowColor = [UIColor blackColor].CGColor;
    6. layer1.shadowOpacity = 1.0;
    7. layer1.shadowRadius = 5.0;
    8. layer1.shadowOffset = CGSizeMake(0, 3);
    9. layer1.cornerRadius = 20;
    10. detailcell.clipsToBounds = NO;
    11. [detailcell.layer insertSublayer:layer1 atIndex:0];
    Alles anzeigen

    (Was übrigens genauso funktioniert.)
    Und ja du hast recht, wie es im Anfangs-Thread steht ist es sinnlos.
    Nun bleibt aber immer noch das Speicherproblem offen, oder verstehe ich das mit den layern noch nicht richtig?

    Für mich sieht das erstmal gut aus, so.
    Außer, dass weder 'contents' oder ein Zeichendelegate gesetzt wurde.
    Was in so einem Fall passiert, also das der Layer nichts zeichnet, weiss ich nicht, ich halte mich an die Doku.
    I would be embarrassed if they did not spy on me.