0

我正在使用核心图形绘制自定义 UITableViewCell,基于 Loren Brichter 的 Fast TableView 示例。

我在自定义单元类中使用了一些 iVar,我将其创建为具有强参考(因此为 ARC)的原子(多线程安全)。

现在,当我开始太快地滚动 tableView 时,问题就开始了。- (void)drawContentView:(CGRect)rect我在子类化以执行自定义绘图的方法上随机崩溃。

问题是我在自定义单元类中使用的 iVar 已被释放,并且内存现在由其他对象拥有,这当然会导致崩溃。

我尝试对整个绘图代码使用@synchronized 指令,以强制对绘图代码进行互斥锁,但这并没有解决问题。

有没有其他人遇到过这个问题并且知道问题的解决方案?

4

1 回答 1

2

原子并不普遍意味着“多线程安全”。这只是意味着当您使用 getter 时,您将在其上获得一个额外的保留/自动释放对(因此它不会在您的运行循环期间消失),并且它将与 setter 同步,这样您就可以如果设置和发生碰撞,则不会得到半个对象。仅当您使用 getter 和 setter 时,这一切都是正确的。您不应该直接访问 ivars。如果你是,那么原子就没有任何意义。

您也可能在主线程以外的线程上修改主 UIKit 上下文。你不能这样做。主 UIKit 上下文(交给 的drawRect:)仅在主线程上有效。

于 2012-06-07T19:04:40.027 回答