UIView支持层 - 委托是一个僵尸

时间:2011-04-04 22:20:29

标签: ios calayer

我有一个UIView类,它使用自定义CALayer派生的后备层。即,我有一个静态的layerClass方法,它返回我的自定义CALayer类的类。

+ (Class)layerClass
{
    return [CellLayer class];
}

在这个类(CellLayer)中,我将委托转换为包含后备层的UIView类 - 具体来说,在drawInContext:方法中我执行此操作:

CellClass* cell = (CellClass*)self.delegate;

(其中CellCass是UIView的子类)

除非有时调用drawInContext:方法并且委托是僵尸(NSZombieEnabled设置为TRUE),否则这似乎工作正常。

似乎发生的事情是,当从其superview(UIScrollView)中删除单元格对象时,在释放后备层并且后备层获得drawInContext:调用之前释放单元格。 NSLog语句显示BOTH dealloc方法最终被调用(即UIView和CALayer的dealloc都被调用)但是我无法确定自从使用它的应用程序有多少和几十个这些单元格后的顺序 - 我想我可以更改NSLog以在控制台中显示单元格的地址,并匹配UIView dealloc和CALayer dealloc,但我没有费心去做。

我的期望是支持层将在包含它的UIView之前释放。

这是正确的行为吗?我目前的解决方法是在UIView的dealloc中我在后备层(viewWasReleased)中设置了一个标志,而在drawInContext中我只是在设置了这个标志时返回。

有更好,更清洁的方法吗?

1 个答案:

答案 0 :(得分:0)

今天我有同样的问题,我终于解决了我的问题。

问题在于,当调用方法dealloc时,不会销毁CellLayer,因为它具有对当前对象的引用。 (委托)所以CALayer没有被销毁,而self.delegate是一个解除分配的实例。僵尸之一。

我修复了在我的类viewDidDisappear方法中添加,并在那里添加了下一个代码:

if(cell != nil)
    cell.delegate = nil;

然后在我的对象中调用dealloc方法时,CALayer中没有引用它,所以使用简单的self.cell = nil;之前将销毁CALayer对象,您将不会遇到委托问题。