2010-01-28 2 views
1

Я создаю UILabels в своем UIView, заполнив их данными, добавив их для просмотра и освободив их.Обновление/удаление 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 для каждого из них.

Если вы хотите удалить определенные UILabels, предоставьте дополнительную информацию о том, какие из них должны быть.

Одна вещь, которую я предложил бы для вашего кода выше: ваш метод - (UILabel *)scrollLabel:(NSString *)text x:(float)x_ y:(float)y_ должен возвращать autileleased UILabel. Поэтому его последняя строка должна быть return [label autorelease];. Если вы хотите вернуть сохраненный объект, добавьте новый/copy/сохранить в имя метода, чтобы вы знали, что возвращаемый объект сохраняется каждый раз, когда вы его вызываете.

Следовательно, после добавления его в UIView вам не нужно выпускать ярлык. Это не влияет на вашу конкретную программу, но хорошо иметь привычку делать это таким образом, чтобы вы не путали ваши резервы/релизы в будущем.

+0

спасибо за ваш ответ Димитрис. хорошо, плохо добавьте собственный uiview в свой вид прокрутки и удалите их, перейдя через дочерние элементы этого представления. благодаря! Что вы имеете в виду: «вам не нужно выпустить ярлык после добавления его в UIView». вы имеете в виду, что мне не нужно выпускать их, когда я возвращаю автореализованный объект в моем методе или вообще? Какая разница, если я также добавлю новое/copy/сохраняю к возвращенному значению? он имеет более высокий выпуск, тогда, хорошо, но является ли это преимуществом в любом случае? – choise

+0

Прежде всего, ваш код работает нормально, как есть. Вы сохраняете UILabel при его создании, и вы отпускаете его, когда добавляете его в представление. Все в порядке, утечки памяти нет. Что плохого в вашем коде (но не неправильно, просто плохая практика), является тот факт, что ваш метод возвращает сохраненный объект. В Cocoa все методы, возвращающие сохраненный объект, имеют слово * new *, * copy * или * preserve * в их имени, так что разработчик, вызывающий их, будет знать, что он должен сам освободить объект. (продолжение следует) – Dimitris

+0

(продолжение) Таким образом, я предлагал либо автоопределить ярлык перед его возвратом, либо просто переименовать ваш метод в нечто вроде '- (UILabel *) scrollLabelCopy: (NSString *) text x: (float) x_ y : (float) y_', так что каждый раз, когда вы его вызываете, вам напоминают о том, что возвращенный объект уже сохранен *) scrollLabelCopy: (NSString *) text x: (float) x_ y: (float) y_' , так что каждый раз, когда вы его вызываете, вам напоминают о том, что возвращаемый объект уже сохранен. Следующее соглашение может быть запутанным при запуске с управлением памятью в Cocoa. – Dimitris

Смежные вопросы