Обновление надписи на кнопке, вызывающее сбой приложения IPhone - PullRequest
0 голосов
/ 10 октября 2009

В настоящее время я учу себя разработке Objective-C и Iphone, используя очень хороший «Начинающий IPhone Development». Я играл с одним из примеров приложений и пытаюсь обновить одну кнопку текстом из текстового поля, когда нажата другая кнопка. Я настроил свои Действия и ссылки и весь этот джаз. Код одиночного метода / функции / вызова ниже

-(IBAction)updateButtonPressed
{
NSString *newCaption = [[NSString alloc] initWithString:@"."];

newCaption = tfUpdateText.text;
[btnPressMe setTitle:newCaption forState:UIControlStateNormal];

[newCaption release];


}  

Отлично работает при первом нажатии кнопки и, может быть, два или три раза после этого вылетает. Я, очевидно, делаю что-то действительно глупое, но я не вижу этого. Это все, что я добавил (а также объявления, свойства - синтез и т. Д.). Может кто-нибудь указать на мою очевидную утечку памяти.

Обновление:

Если я перейду на это

-(IBAction)updateButtonPressed
{

[btnPressMe setTitle:tfUpdateText.text forState:UIControlStateNormal];



}  

Работает нормально, но кто-нибудь может мне объяснить, какую ошибку я совершил?

Ответы [ 3 ]

2 голосов
/ 10 октября 2009

Вы неправильно управляете памятью. Для чего нужен -initWithString:@"."? Вы генерируете постоянную строку @ ".", Затем пропускаете ее, затем указываете на другую строку (tfUpdateText.text), затем назначаете этот указатель на заголовок, затем освобождаете объект -text.

Это и утечка, и чрезмерный выброс. Это переизбыток, который падает.

Возможно, вы имели в виду это:

-(IBAction)updateButtonPressed
{
    [btnPressMe setTitle:tfUpdateText.text forState:UIControlStateNormal];
}
2 голосов
/ 10 октября 2009

У вас ошибка управления памятью. Ссылочный объект newCaption, который вы отпускаете, отличается от того, который вы инициализировали. Вы случайно слили выделенное NSString и выпустили вместо него tfUpdateText.text.

Вы можете удалить временную переменную, например:

-(IBAction)updateButtonPressed
{
    [btnPressMe setTitle:tfUpdateText.text forState:UIControlStateNormal];
}
1 голос
/ 10 октября 2009

Вы не используете NSString должным образом здесь (и действительно делаете намного больше работы, чем требуется). Строки NSS являются всего лишь указателями, поэтому ваше второе назначение newCaption просто осиротит первое. Когда вы позже отправляете [newCaption release], вы отправляете его не на свой объект alloc'd, а на tfUpdateText.text, который вы не сохранили. Избавьтесь от alloc и release, и все будет готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...