首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >访问UIColor*时出现访问错误

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

Stack Overflow用户
提问于 2009-09-21 18:11:39
回答 1查看 1.1K关注 0票数 1

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

代码语言:javascript
运行
复制
CGContextRef context = UIGraphicsGetCurrentContext();   
UIColor* backgroundColor = [UIColor colorForHex:@"FFFEFF"];
[backgroundColor set];
CGContextFillRect(context, rect);

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

代码语言:javascript
运行
复制
return [UIColor colorWithRed:((float) r/255.0f) green:((float) g/255.0f) blue:((float) b/255.0f) alpha:a];

现在这样做很好,但我试图改进这一点,并集中颜色(和字体)的创建,试图尽可能加快绘制例程。这就是我遇到问题的地方。

我使用以下命令创建一个协议:

代码语言:javascript
运行
复制
@protocol ItemListTableViewCellDelegate
-(UIFont*) fontForId:(int) fontID;
-(UIColor*) colorForId:(int) colorID;
@end

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

代码语言:javascript
运行
复制
-(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成员,该成员使用控制器进行初始化,以便单元可以调用

代码语言:javascript
运行
复制
UIColor* backgroundColor = [cellDelegate colorForId:BACKGROUND_COLOR_ID]; 

这似乎返回了控制器中UIColor的正确指针,但当在单元格绘制方法中对此颜色调用'set‘时,单元格将抛出一个严重的访问错误,我无法找出原因。

有什么正确方向的建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-09-21 18:18:04

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

它的工作原理是从不实际释放对象,而是将其包装为“僵尸”,并在其内部设置一个标志,表明它通常会被释放。这样,如果您再次尝试访问它,它仍然知道在您出错之前它是什么,并且通过这一小部分信息,您通常可以回溯到问题是什么。

当调试器有时会在任何有用的信息上出现问题时,它在后台线程中尤其有用。

非常重要的一点是,你需要100%确保这只出现在你的调试代码中,而不是你的发行版代码中。因为什么都不会发布,所以你的应用程序会不断泄漏。为了提醒我这样做,我将这个日志放到了我的应用程序委托中:

代码语言:javascript
运行
复制
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
  NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1455961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档