在我的自定义UITableViewCell绘图例程中,使用了以下内容,没有任何问题:
CGContextRef context = UIGraphicsGetCurrentContext();
UIColor* backgroundColor = [UIColor colorForHex:@"FFFEFF"];
[backgroundColor set];
CGContextFillRect(context, rect);当然,这是非常标准的,除了我在colorForHex的UIColor对象上的接口,它接受一个字符串,并将其分解为0-255的RGB值,并返回一个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‘时,单元格将抛出一个严重的访问错误,我无法找出原因。
有什么正确方向的建议吗?
发布于 2009-09-21 18:18:04
对于任何EXC_BAD_ACCESS错误,您通常会尝试向已发布的对象发送消息。追踪这些问题的最佳方法是使用NSZombieEnabled。
它的工作原理是从不实际释放对象,而是将其包装为“僵尸”,并在其内部设置一个标志,表明它通常会被释放。这样,如果您再次尝试访问它,它仍然知道在您出错之前它是什么,并且通过这一小部分信息,您通常可以回溯到问题是什么。
当调试器有时会在任何有用的信息上出现问题时,它在后台线程中尤其有用。
非常重要的一点是,你需要100%确保这只出现在你的调试代码中,而不是你的发行版代码中。因为什么都不会发布,所以你的应用程序会不断泄漏。为了提醒我这样做,我将这个日志放到了我的应用程序委托中:
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");https://stackoverflow.com/questions/1455961
复制相似问题