2012-02-25 34 views
4

我有一個自定義視圖類,它是UITableViewCell的一個子類。ARC能否足夠聰明地發佈超類中定義的子視圖?

我從這個子類繼承其他兩個自定義視圖類(他們分享了很多相同的屬性,但足以給不同需要單獨的類)。

我已經聲明瞭共享屬性在在各自所屬類別MyParentCell,也宣佈其獨特的性質。

UITableViewCell 
     | 
     | 
MyParentCell // defines propertyA and propertyB, both IBOutlet subviews 
    /\ 
    / \ 
/ \ 
    |  | 
    |  ChildClass1 // defines propertyC, an IBOutlet subview 
    | 
ChildClass2 // defines property D, an IBOutlet subview 

我的問題是:由於我使用ARC,不能顯式調用[super delloc];當我在定義dealloc: ChildClass1ChildClass2做,我必須釋放所有他們所擁有的每個子視圖類,還是MyParentCell#dealloc仍然會被調用?

我必須這樣寫:

// ChildClass1.m 
@implementation ChildClass1 

-(void)dealloc 
{ 
    self.propertyA = nil; 
    self.propertyB = nil; 
    self.propertyC = nil; 
} 
@end 

// ChildClass2.m 
@implementation ChildClass2 

-(void)dealloc 
{ 
    self.propertyA = nil; 
    self.propertyB = nil; 
    self.propertyD = nil; 
} 
@end 

抑或是足以寫:

// MyParentCell 
@implementation MyParentCell 

-(void)dealloc 
{ 
    self.propertyA = nil; 
    self.propertyB = nil; 
} 
@end 

// ChildCell1.m 
@implementation ChildCell1 

-(void)dealloc 
{ 
    self.propertyC = nil; 
} 
@end  

// ChildCell2.m 
@implementation ChildCell2 

-(void)dealloc 
{ 
    self.propertyD = nil; 
} 
@end 

如果第二種方法是好的,有人可以解釋何時如何調用MyParentCell#dealloc?

如果第一種方法是必要的,吸住:/

+0

設置self.property爲零目前還只是推薦使用viewDidUnload和的.xib時IBOutlets,在你的情況下,它肯定不是必要的。雖然這是你的關注,如果ARC實際上是零這個屬性是可以理解的:) – 2012-02-25 14:05:53

+0

我正在加載一個自定義xib文件到表 - 據我所知'viewDidUnload'是一個UIViewController事件,所以不會被調用在自定義子視圖的情況下。這是否意味着我不必擔心將它的子視圖設置爲零? – bodacious 2012-02-25 14:11:22

+0

你是對的 - 我的觀點是,仍然會建議零價錢。在你的情況下,它不是必需的。 – 2012-02-25 14:28:47

回答

2

當然,也與ARC每類負責清理只有自己的資源。如果你在子類中定義了一個dealloc,它會在你的方法結束時隱式地調用父對象的dealloc。你只需不必輸入。

如果你只是釋放實例變量或屬性,你可以依靠ARC整個的dealloc鏈完成後爲你做這個。 ARC默默地實現了從NSObject的dealloc中調用的.cxx_destruct,並負責釋放類中強大的任何東西。

+0

感謝您的解釋 - 我現在明白,dealloc將會在超類中被調用,所以我不必擔心這樣做。我一直認爲每個班級都應該清理自己的資源,但對這篇文章的其他評論說,使用ARC這不是必需的。有什麼想法嗎? – bodacious 2012-02-25 14:45:06

1

無不需要使用的dealloc在所有作爲一般規則(但在某些情況下),把AIN dealloc中的NSLog的顯示只是一個dealloc的字。運行在ARC一切信任自動發生

1

你不必做這兩種方法1,也沒有辦法2.你並不需要實現dealloc可言。當你的子類的實例被釋放時,它保留的對象將被自動釋放。所以如果他們沒有保留在其他地方,他們也將被釋放。

+0

OK - 所以,即使屬性特性是一個** **強之一,這是不可能會有任何共享所有權,所以當家長的看法是它會自動釋放? – bodacious 2012-02-25 14:08:15

+0

共享所有權是什麼意思? – sch 2012-02-25 14:12:17

+0

另一個UIView子類實例擁有相同屬性的強**(保留)所有權 - 我猜在子視圖的情況下,如果沒有一些非常糟糕的編碼,這種情況不太可能發生? – bodacious 2012-02-25 14:15:11

相關問題