2010-01-28 30 views
1

我在我的UIView中創建了一些UILabels,填充數據,添加它們以查看和釋放它們。從視圖更新/刪除UILables

UILabel *speed = [self scrollLabel:@"some Text" x:455.0f y:75.0f]; 
[scrollView addSubview:speed]; 
[speed release]; 

的方法:

- (UILabel *)scrollLabel:(NSString *)text x:(float)x_ y:(float)y_ { 

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(x_, y_, 300.0f, 20.0f)]; 
[label setText:NSLocalizedString(text,@"")]; 
[label setFont:[UIFont fontWithName:@"Helvetica" size:14]]; 
[label setTextColor:[UIColor colorWithRed:255.0 green:255.0 blue:255.0 alpha:1.9]]; 
[label setBackgroundColor:[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0]]; 

return label; 

} 

我有一個按鈕,用戶可以在其中重新加載uilabels的數據。我將從superfiew中移除所有這些標籤的父視圖,生成新數據並再次設置標籤的方法。

問題是,舊的UILabels仍然存在,所以我的問題是,什麼是最好的方法來刪除這個特殊的標籤?

我做了一個循環,並刪除所有子視圖,問題是,我也有一些其他子視圖在那裏,我不想刪除。

另一個問題:是否有更好的方法來設置多個標籤的字體樣式?

回答

1

我建議在特定的UIView中添加所有的標籤,我們稱之爲labelHolderView。然後每次你想刪除它們,只需遍歷所有的孩子,併爲每個孩子打電話removeFromSuperview

如果您只想刪除特定的UILabel,請提供更多信息,以瞭解它們應該是哪些。

我會建議你的代碼上面的一件事:你的- (UILabel *)scrollLabel:(NSString *)text x:(float)x_ y:(float)y_方法應該返回一個自動釋放的UILabel。所以它的最後一行應該是return [label autorelease];。如果要返回保留的對象,請在方法名稱中添加新/複製/保留,以便您知道每次調用返回的對象時都會保留。

因此,將標籤添加到UIView後,不需要釋放標籤。這不會影響你的特定程序,但最好養成這樣做的習慣,這樣你就不會在未來弄亂你的保留/發佈。

+0

感謝您的回答Dimitris。好吧,虐待添加自己的uiview到我的滾動視圖,並通過循環瀏覽這個視圖的兒童刪除它們。謝謝! 你是什麼意思與「你不需要釋放標籤後,你將其添加到UIView」。你的意思是我不必釋放他們,當我在我的方法或一般返回一個autoreleased對象? 如果我還添加新/複製/保留到返回值會有什麼區別?它有一個更大的releasecount然後,好吧,但這是一個優勢在任何方面? – choise 2010-01-29 09:57:57

+0

首先,您的代碼可以正常工作。創建它時保留一個UILabel,並在將其添加到視圖時將其釋放。沒關係,沒有內存泄漏。 你的代碼有什麼不好(但沒有錯,只是不好的做法),是你的方法返回一個保留對象的事實。在Cocoa中,所有返回保留對象的方法在其名稱中都帶有* new *,* copy *或* retain *這樣的名稱,這樣開發人員就會知道他必須自己釋放對象。 (待續) – Dimitris 2010-01-29 11:11:13

+0

(續)所以我只是建議在返回標籤之前自動釋放標籤,或者只是將方法重命名爲' - (UILabel *)scrollLabelCopy:(NSString *)text x:(float)x_ y :(float)y_',以便每次調用它時,都會提醒您返回的對象已保留*)scrollLabelCopy:(NSString *)text x:(float)x_ y:(float)y_' ,這樣每次調用它時,都會提醒您返回的對象已保留。 在Cocoa中開始內存管理時,遵循此約定可能會引起混淆。 – Dimitris 2010-01-29 11:13:13