2012-01-14 32 views
0

我有一個UIViewController,實現UITableViewDelegateUITableViewDataSource。我自定義使用viewForHeaderInSection方法節標題:UITableView viewForHeaderInSection-自動發佈的視圖崩潰的應用程序

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 

UILabel *label = sectionHeaderLabel(); 

switch (section) { 
    case 0: 
     label.text = @""; 
     break; 
    case 1: 
     label.text = @"Points"; 
     break; 
    case 2: 
     label.text = @"Problems"; 
     break; 
    default: 
     label.text = @""; 
     break; 
} 

// Create header view and add label as a subview 
UIView *view = [[UIView alloc] initWithFrame:CGRectZero]; 
[view addSubview:label]; 
[label release]; 

return view; 

}

編譯器會抱怨,我有相關的可以查看內存泄漏,我意識到,我應該自動釋放它。但是當我這樣做時,我的應用程序崩潰,當我點擊後退按鈕彈出導航控制器的視圖。

這是怎麼回事?

回答

0

該問題可能與標籤而不是視圖有關。

sectionHeaderLabel()方法是否返回自動釋放標籤對象?如果是這樣,你不應該在添加它作爲子視圖來查看之後明確地釋放標籤。

嘗試刪除[label release];並返回[查看autorelease];

+0

Spot-on!謝謝! – jay492355 2012-01-14 18:12:38

+0

如果這是一個新項目,並且您不支持iOS 3.x,則可能需要嘗試打開ARC。它會爲你節省這些錯誤。 – 2012-01-17 09:21:57

0

在繼續進一步開發之前,您需要詳細閱讀memory management rules - 這將爲您節省很多的痛苦。

Clang(不是編譯器)抱怨是因爲你從名稱指示它返回一個自動釋放對象的方法返回+1保留對象(不匹配的init)。然後(就像Nick說的那樣),你可能會從sectionLabelHeader()返回一個自動釋放對象。因此,「觀看」的過度保留掩蓋了「標籤」的過度釋放。

最後,你爲什麼使用C函數返回一個UILabel *?這是合法的AFAIK,但非正統的。這也不會讓我感到驚訝,如果那也會絆倒Clang。如果/當您移動到自動引用計數(ARC)時,它肯定會導致問題。我建議你使用一種方法,或者如果你要去工廠,則使用類方法。

+0

感謝您使用方法代替C函數的建議。我想知道:如果我使用各種預設屬性(字體大小,文本顏色等)的自定義標籤,並在衆多視圖中使用,最好使用UILabel子類,使用類別擴展UILabel,或者只需調用工廠方法? – jay492355 2012-01-14 18:22:18

+0

如果你需要*覆蓋*方法,我會說只有子類。如果你所做的只是設置屬性,那麼UILabel上的一個類別可能就是要走的路。只要確保前綴(好吧,我個人更喜歡後綴爲可讀性)的方法,所以你不要與任何目前或未來的私人方法衝突。類似於+ labelWithCustomProperties_JAG {}。 – 2012-01-14 19:23:21

相關問題