2011-04-04 77 views
0

我有一个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中设置了一个标志,如果这个标志被设置,我会简单地返回。

有没有更好,更干净的方法来做到这一点?

回答

0

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

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

我固定,在加入我的类viewDidDisappear方法,并有我已经添加了下一个代码:

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

然后,当dealloc方法被称为我的对象存在于CALayer的未引用它,因此与一个简单的self.cell =零; CALayer对象将在之前被销毁,并且您将不会遇到委托人的问题。