访问UIColor时出现错误访问错误*

时间:2009-09-21 18:11:39

标签: iphone uicolor

在我的自定义UITableViewCell的绘图例程中,使用了以下内容而没有任何问题:

CGContextRef context = UIGraphicsGetCurrentContext();   
UIColor* backgroundColor = [UIColor colorForHex:@"FFFEFF"];
[backgroundColor set];
CGContextFillRect(context, rect);

当然,这是非常标准的,除了我在colorForHex的UIColor对象上的接口,它接受一个字符串并将其分解为RGB值0-255并返回具有以下内容的UIColor对象(a默认为1.0f ):

return [UIColor colorWithRed:((float) r/255.0f) green:((float) g/255.0f) blue:((float) b/255.0f) alpha:a];

现在这个工作正常,但我试图改进这个并集中颜色(和字体)创建,以尽可能地加速绘制例程。这就是我遇到问题的地方。

我使用以下方法创建协议:

@protocol ItemListTableViewCellDelegate
-(UIFont*) fontForId:(int) fontID;
-(UIColor*) colorForId:(int) colorID;
@end

控制器实现此协议并将colorForId方法实现为:

-(UIColor*) colorForId:(int) colorID {
    UIColor* requestedColor = nil;
    switch (colorID) {
        case BACKGROUND_COLOR_ID:
        {
            requestedColor = backgroundColor;
        }
            break;
    }
    return requestedColor;
}

其中backgroundColor作为控制器的成员创建为控制器的initWithStyle方法中的UIColor *。正在调用它并正在创建backgroundColor。

单元格有一个NSObject<ItemListTableViewCellDelegate>* cellDelegate成员,用控制器初始化,以便单元格可以调用

UIColor* backgroundColor = [cellDelegate colorForId:BACKGROUND_COLOR_ID]; 

似乎在控制器中返回正确的指向UIColor的指针,但是当在单元格绘制方法中对此颜色调用'set'时,单元格会抛出一个BAD ACCESS错误,我无法解决原因。< / p>

指向正确方向的任何指针?

1 个答案:

答案 0 :(得分:2)

对于任何EXC_BAD_ACCESS错误,您通常会尝试向已发布的对象发送消息。追踪这些内容的最佳方式是使用NSZombieEnabled

这可以通过永远不会实际释放一个对象,但将其包装为“僵尸”并在其中设置一个标志,表示它通常会被释放。这样,如果您再次尝试访问它,它仍然知道在发生错误之前它是什么,并且通过这些信息,您通常可以回溯以查看问题所在。

当调试器有时会抓取任何有用的信息时,它特别有助于后台线程。

非常重要但是,您需要100%确保这只是在您的调试代码而不是您的分发代码中。因为什么都没有发布,你的应用程序将泄漏,泄漏和泄漏。为了提醒我这样做,我把这个日志放在我的appdelegate:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
  NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");