2011-04-04 42 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對象將在之前被銷燬,並且您將不會遇到委託人的問題。