0

编辑:我尝试使用 push/pop 的东西,但现在它崩溃了。

我有一种感觉,我正在尝试做的事情很遥远。有没有办法让核心图形出现在屏幕上?我需要能够每帧更新的东西,比如在总是四处移动的两点之间画一条线。即使有人知道一个完整的替代方案,我也会尝试一下。

在.h

CGContextRef context;

在初始化方法中

int width = 100;
int height = 100;

void *buffer = calloc(1, width * height * 4);
context = CreateBitmapContextWithData(width, height, buffer);

CGContextSetRGBFillColor(context, 1, 1, 1, 1);
CGContextAddRect(context, CGRectMake(0, 0, width, height));
CGContextFillPath(context);

CGImageRef image = CGBitmapContextCreateImage(context);

hud_sprite = [CCSprite spriteWithCGImage:image key:@"hud_image1"];

free(buffer);
free(image);

hud_sprite.anchorPoint = CGPointMake(0, 0);
hud_sprite.position = CGPointMake(0, 0);

[self addChild:hud_sprite z:100];

在我想更新它时调用的方法中。

int width = 100;
int height = 100;

UIGraphicsPushContext(context);

    CGContextClearRect(context, CGRectMake(0, 0, width, height)); //<-- crashes here. bad access...

    CGContextSetRGBFillColor(context, random_float(0, 1),random_float(0, 1),random_float(0, 1), .8);
    CGContextAddRect(context, CGRectMake(0, 0, width, height));
    CGContextFillPath(context);

    CGImageRef image = CGBitmapContextCreateImage(context);

UIGraphicsPopContext();

//CGContextRelease(ctx);

[[CCTextureCache sharedTextureCache] removeTextureForKey:@"hud_image1"];
[hud_sprite setTexture:[[CCTextureCache sharedTextureCache] addCGImage:image forKey:@"hud_image1"]];

free(image);
4

1 回答 1

0

你在打电话UIGraphicsPushContext(context)。您必须与UIGraphicsPopContext(). 由于您没有调用UIGraphicsPopContext(),因此您将离开contextUIKit 的图形上下文堆栈,因此它永远不会被释放。

此外,您正在调用UIGraphicsBeginImageContext,它会创建一个新的图形上下文,稍后您可以通过调用UIGraphicsEndImageContext. 但是你永远不会使用这个上下文。你可以通过调用来访问上下文UIGraphicsGetCurrentContext,但你永远不会调用它。

更新

永远不要调用freeCore Foundation 对象!

您将CGImage通过以下语句获得一个(这是一个核心基础对象):

CGImageRef image = CGBitmapContextCreateImage(context);

然后稍后你会调用free它:

free(image);

你绝不能那样做。

去阅读Core Foundation 的内存管理编程指南。当你完成了一个 Core Foundation 对象并且你拥有它的所有权(因为你是从一个 Create 函数或一个 Copy 函数得到它的),你必须用一个 Release 函数来释放它。在这种情况下,您可以使用CFReleaseCGImageRelease

CGImageRelease(image);

此外,您正在分配bufferusing calloc,然后将其传递给CreateBitmapContextWithData(我猜这是您的包装器CGBitmapContextCreateWithData),然后释放buffer. 但context保留一个指向缓冲区的指针。所以在你之后free(buffer)context有一个悬空指针。这就是你崩溃的原因。buffer在你释放之前你不能自由context

处理这个问题的最好方法是CGBitmapContextCreateWithData通过NULL作为第一个 ( data) 参数传递来处理分配缓冲区本身。在这种情况下,没有理由自己分配缓冲区。

于 2012-10-08T02:25:08.407 回答