NSMutable Строка "Out of scope" - PullRequest
2 голосов
/ 27 марта 2010

У меня есть два объекта NSMutableString, определенных в моем файле viewController (подкласс UITableViewController) .h файл:

NSMutableString *firstName;
NSMutableString *lastName;

Это свойства:

@property (nonatomic, retain) NSMutableString *firstName;
@property (nonatomic, retain) NSMutableString *lastName;

Я синтезирую их в файле .m.

В моем методе viewDidLoad - я установил их как пустые строки:

firstName = [NSMutableString stringWithString:@""];
lastName = [NSMutableString stringWithString:@""];

firstName и lastName могут быть изменены пользователем. В моем методе cellForRowAtIndexPath я пытаюсь отобразить содержимое этих строк:

cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ %@", firstName, lastName];

но это вызывает сбой приложения, как только отображается контроллер представления. При использовании отладчика кажется, что firstName и lastName находятся вне области действия или не существуют. Я новичок в Xcode, но кажется, что отладчик останавливается на objc_msgSend.

Что я делаю не так?

Ответы [ 5 ]

6 голосов
/ 27 марта 2010

Проблема в том, что вам нужно сделать:

self.firstName = ...
self.lastName = ...

Это вызовет автоматически сгенерированные методы установки, которые сохранят значения. Просто присваивая, вы обходите установщики, и как только текущий пул автоматического выпуска будет очищен, две переменные будут иметь висячие указатели.

1 голос
/ 27 марта 2010

возьмите в привычку ставить self.variableName ... и вместо stringWithsString попробуйте использовать initWithString ... надеюсь, это решит проблему ... Кстати, вы очень хорошо объяснили вопрос ...

0 голосов
/ 14 марта 2012

какой стиль ячейки вы использовали?

if (cell == nil) {
  cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
                                 reuseIdentifier:BasicCellIdentifier] autorelease];
}

возможно, это вам поможет

0 голосов
/ 27 марта 2010

Вы не можете использовать:

firstName = [NSMutableString stringWithString:@""];

Поскольку он будет освобожден, как только viewDidLoad выполнение завершится.

Попробуйте:

firstName = [[NSMutableString alloc] initWithString:@""];

Или:

[self setFirstName:[NSMutableString stringWithString:@""]];

И не забудьте опубликовать firstName и lastName в сообщении dealloc.

0 голосов
/ 27 марта 2010

Ваша ячейка загружается и получает доступ к firstName и lastName до их инициализации. viewDidLoad слишком поздно, попробуйте awakeFromNib или viewWillLoad или что-то еще на iPhone.

...