我有一个UIView类,它使用自定义的CALayer派生支持层。即,我有一个静态的layerClass方法,它返回我的自定义CALayer类的类。UIView支持层 - 委托是僵尸
+ (Class)layerClass
{
return [CellLayer class];
}
在这一类(CellLayer)我投委托给类,它包含背衬层了UIView的 - 即,drawInContext:
方法内我这样做:
CellClass* cell = (CellClass*)self.delegate;
(其中CellCass是UIView的一个子类)
这似乎工作正常,除了有时调用drawInContext:
方法,委托是僵尸(NSZombieEnabled设置为TRUE)。
看来发生了什么事情是,当从其超级视图(这是一个UIScrollView)中删除单元格对象时,单元格会在释放内部层之前释放,并且内部层获得drawInContext:
调用。 NSLog语句显示最终调用了BOTH dealloc方法(即UIView和CALayer的dealloc都被调用了),但我无法确定自从应用程序使用这个命令以来有多少顺序 - 有几十个这样的单元 - 我想我可以更改NSLog以在控制台中显示单元格的地址,并匹配一个UIView dealloc和一个CALayer dealloc,但是我并没有打算这样做。
我的期望是在包含它的UIView之前释放背层。
这是正确的行为吗?我目前的解决方法是在UIView的dealloc中,我在背景层(viewWasReleased
)和drawInContext中设置了一个标志,如果这个标志被设置,我会简单地返回。
有没有更好,更干净的方法来做到这一点?