EXC_BAD_ACCESS-Error

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

  • EXC_BAD_ACCESS-Error

    Hallo,

    Im folgenden Code tritt in der Zeile:

    Quellcode

    1. [printImage drawAtPoint:CGPointMake(0, 0)];


    ein EXC_BAD_ACCESS-Fehler auf, den ich mir nicht erklären kann. Die drawRect:-Methode der MainView-Klasse wird 33 Mal pro Sekunde aufgerufen und nur dann, wenn das UIImage *printImage noch nicht initialisiert ist, soll die "createBitmapContext"-Methode aufgerufen werden.

    Quellcode

    1. #import "MainView.h"
    2. @implementation MainView
    3. - (id)initWithFrame:(CGRect)frame
    4. {
    5. self = [super initWithFrame:frame];
    6. if (self) {
    7. planet = [UIImage imageNamed:@"Planet.png"];
    8. baum = [UIImage imageNamed:@"Baum.png"];
    9. }
    10. return self;
    11. }
    12. - (void)drawRect:(CGRect)rect
    13. {
    14. if (!printImage) {
    15. printImage = [self createBitmapContext];
    16. }
    17. [printImage drawAtPoint:CGPointMake(0, 0)];
    18. }
    19. - (UIImage *) createBitmapContext {
    20. CGColorSpaceRef cSpc = CGColorSpaceCreateDeviceRGB();
    21. CGImageRef CGBaum = [baum CGImage];
    22. CGImageRef CGPlanet = [planet CGImage];
    23. center = CGPointMake(160, 240);
    24. int trees = (arc4random()%50)+1;
    25. int rad = (arc4random()%40) + 80;
    26. CGContextRef bitmap = CGBitmapContextCreate(NULL,
    27. 320,
    28. 480,
    29. 8,
    30. 1280,
    31. cSpc,
    32. kCGImageAlphaPremultipliedLast);
    33. CGContextDrawImage(bitmap, CGRectMake(center.x-rad, center.y-rad, 2*rad, 2*rad), CGPlanet);
    34. for (int i=0; i<trees; i++) {
    35. int angle = arc4random()% 360;
    36. height = (arc4random()% 20)+40;
    37. dgr = (angle * (M_PI/180));
    38. CGContextSaveGState(bitmap);
    39. CGContextTranslateCTM(bitmap, center.x + sinf(dgr) * (rad + height - 5), center.y + cosf(dgr) * (rad + height - 5));
    40. CGContextRotateCTM(bitmap, 2*M_PI-dgr);
    41. CGContextDrawImage(bitmap, CGRectMake(0-width/2, 0-height, height/1.5, height), CGBaum);
    42. CGContextRestoreGState(bitmap);
    43. }
    44. CGImageRef rI = CGBitmapContextCreateImage(bitmap);
    45. UIImage *img = [UIImage imageWithCGImage:rI];
    46. printImage = img;
    47. CGContextRelease(bitmap);
    48. return img;
    49. }
    50. @end
    Alles anzeigen


    weiß jemand, wie ich diesen Fehler beheben kann?
    Danke im Voraus
  • objectivemevert schrieb:

    interessant ist vielleicht noch, dass das Programm einwandfrei funktioniert, wenn man die Methode JEDEN Durchlauf aufruft. Dann werden zwar sehr schnell viele Bilder angezeigt, aber grundsätzlich verläuft alles problemlos - nur eben nicht so, wie es soll.

    Dein Vorgehen ist ungewöhnlich; warum verwendest Du für die Anzeige des Bildes keinen Imageview? Außerdem bringt Dir die Lazy-Initialization meines Erachtens nichts. Die Methode drawRect: ist zum malen da, das Bild solltest Du vorher erstellen.
    „Meine Komplikation hatte eine Komplikation.“
  • Ich versuche ja, das Bild vorher zu erstellen. Sobald ich jedoch versuche, meine - (UIImage *) createBitmapContext-Methode einmalig aufzurufen und mit dem Bild weiterzuarbeiten, bekomme ich diese Fehlermeldung … das ich keinen ImageView verwende liegt wohl an meiner Einsteigerliteratur, in der lediglich die drawAtPoint: - bzw. drawInRect-Methode erläutert wird.

    Spiele Entwickeln für iPad, iPhone und iPod Touch von Thomas Lucka; das Buch habe ich jedoch weitesgehend verstanden, der obige Code bezieht sich nicht darauf.
  • objectivemevert schrieb:

    Ich versuche ja, das Bild vorher zu erstellen. Sobald ich jedoch versuche, meine - (UIImage *) createBitmapContext-Methode einmalig aufzurufen und mit dem Bild weiterzuarbeiten, bekomme ich diese Fehlermeldung

    Ich sehe in der Methode erstmal keinen Fehler. Du solltest lieber mit einem Imageview arbeiten. Vielleicht solltest Du dann mal mit dem Debugger prüfen, ob auch alle Werte so sind.

    objectivemevert schrieb:

    das ich keinen ImageView verwende liegt wohl an meiner Einsteigerliteratur, in der lediglich die drawAtPoint: - bzw. drawInRect-Methode erläutert wird.

    Finde ich sehr ungewöhnlich. Abgesehen davon kannst Du Dir den Zwischenschritt auch sparen und direkt in den Kontext des Views malen.
    „Meine Komplikation hatte eine Komplikation.“
  • Aus irgendeinem Grund scheint es auf diesem Weg wohl zu funktionieren:

    Quellcode

    1. #import "MainView.h"
    2. @implementation MainView
    3. - (id)initWithFrame:(CGRect)frame
    4. {
    5. self = [super initWithFrame:frame];
    6. if (self) {
    7. planet = [UIImage imageNamed:@"Planet.png"];
    8. baum = [UIImage imageNamed:@"Baum.png"];
    9. }
    10. return self;
    11. }
    12. - (void)drawRect:(CGRect)rect
    13. {
    14. [[self returnImg] drawAtPoint:CGPointMake(0,0)];
    15. }
    16. - (UIImage *) createBitmapContext {
    17. CGColorSpaceRef cSpc = CGColorSpaceCreateDeviceRGB();
    18. CGImageRef CGBaum = [baum CGImage];
    19. CGImageRef CGPlanet = [planet CGImage];
    20. center = CGPointMake(160, 240);
    21. int trees = (arc4random()%50)+1;
    22. planetInformation = [[NSMutableArray alloc] initWithCapacity:(trees+1)];
    23. [planetInformation addObject:@"_PLACEHOLDER_"];
    24. int rad = (arc4random()%40) + 80;
    25. CGContextRef bitmap = CGBitmapContextCreate(NULL,
    26. 320,
    27. 480,
    28. 8,
    29. 1280,
    30. cSpc,
    31. kCGImageAlphaPremultipliedLast);
    32. CGContextDrawImage(bitmap, CGRectMake(center.x-rad, center.y-rad, 2*rad, 2*rad), CGPlanet);
    33. for (int i=0; i<trees; i++) {
    34. int angle = arc4random()% 360;
    35. height = (arc4random()% 20)+40;
    36. dgr = (angle * (M_PI/180));
    37. CGContextSaveGState(bitmap);
    38. CGContextTranslateCTM(bitmap, center.x + sinf(dgr) * (rad + height - 5), center.y + cosf(dgr) * (rad + height - 5));
    39. CGContextRotateCTM(bitmap, 2*M_PI-dgr);
    40. CGContextDrawImage(bitmap, CGRectMake(0-width/2, 0-height, height/1.5, height), CGBaum);
    41. CGContextRestoreGState(bitmap);
    42. NSArray *oneTree = [[NSArray alloc] initWithObjects: [NSNumber numberWithInt:height],
    43. [NSNumber numberWithFloat:dgr], nil];
    44. [planetInformation addObject:oneTree];
    45. [oneTree release];
    46. }
    47. CGImageRef rI = CGBitmapContextCreateImage(bitmap);
    48. UIImage *img = [UIImage imageWithCGImage:rI];
    49. [planetInformation replaceObjectAtIndex:1 withObject:img];
    50. CGContextRelease(bitmap);
    51. return img;
    52. }
    53. - (UIImage *) returnImg {
    54. UIImage *retImg;
    55. if (!planetInformation) {
    56. retImg = [self createBitmapContext];
    57. } else {
    58. retImg = [planetInformation objectAtIndex:1];
    59. }
    60. return retImg;
    61. }
    62. @end
    Alles anzeigen