2010-03-27 2 views
2

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

NSMutableString *firstName; 
NSMutableString *lastName; 

Они являются свойствами:

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

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

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

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

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

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

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

Что я делаю неправильно?

+0

Так где же: NSMutableString * ПгвЬЫате; NSMutableString * lastName; Определено?, на уровне файла или на уровне класса или в методе? Просто FYI вы были правы, добавив объектив-c tag BTW, поскольку это определенно «классический» Objective-C. – Wintermut3

ответ

6

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

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

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

1

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

0

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

+0

Это сделало бы значения nil, которые не дали бы ожидаемые строки, но не сбой. – smorgan

+0

«Вне области видимости» не ноль, это означает, что компилятор не получил возможность присвоить любое значение, ноль или нет, той переменной, о которой идет речь. –

0

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

firstName = [NSMutableString stringWithString:@""]; 

Поскольку это будет освобождать как только viewDidLoad заканчивает выполнение.

Try:

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

Или:

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

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

0

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

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

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

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