iPhone SDK выпускает NSString - PullRequest
1 голос
/ 30 марта 2011

Я новичок в Objective C и у меня простой вопрос об управлении памятью.

Это простой метод для кнопки, которая меняет UILabel с текстом в UITextField.

-(IBAction) setLabel
{
    NSString *inputText = [[NSString alloc]initWithString:myTextField.text];

    [myLabel setText:inputText];
    [inputText release];
}

Этот код работает нормально. Но если я изменю этот код на следующий,

-(IBAction) setLabel
{
    NSString *inputText = [[NSString alloc]initWithString:@"some string value"];
    inputText = myTextField.text;       
    [myLabel setText:inputText];
    [inputText release];
}

Затем происходит сбой приложения во время выполнения. Я должен удалить строку [inputText release];, чтобы запустить приложение без сбоев. Насколько я знаю, если я создал что-то с помощью alloc, я должен его выпустить Но здесь, если я выпускаю эту строку, происходит сбой приложения. Может кто-нибудь объяснить причину?

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

Причина сбоя в выпуске заключается в том, что вы переназначаете inputText на myTextField.text. Вызов release теперь освобождает эту строку вместо строки, выделенной в первой строке setLabel. Если вы используете другую переменную для этого назначения, это должно исправить ошибку.

0 голосов
/ 30 марта 2011

Я знаю, что это не прямой ответ на ваш вопрос, но вы должны попытаться использовать пул автоматического выпуска, чтобы не беспокоиться об этих деталях. Таким образом, если вы написали свой код следующим образом:

-(IBAction) setLabel
{
    NSString *inputText = [NSString stringWithString:myTextField.text];    
    [myLabel setText:inputText];
}

код более читабелен и, кроме того, вы не несете ответственности за освобождение экземпляра строки inputText.

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