2011-06-05 1 views
1

Заголовок:Почему мои переменные не сохраняются между методами? - iPhone файл

NSString *righta; 
@property(nonatomic, retain) NSString *righta; 

(я обычно не делают заявлений @property для моих переменных, но думал, что это может помочь переменной сохраняться через класс, хотя он не имеет)

файл

Реализация:

@synthesize righta; 

- (void) function1 { 
    righta = [NSString stringWithFormat:@"A"]; 
} 

- (IBAction)function2:(id)sender { 
    NSLog(@"righta is still %@", righta); 
} 

в попытке доступа к значению строки во второй функции, я получаю «EXC_B AD_ACCESS "и приложение аварийно завершает работу.

Любая помощь была бы высоко оценена.

Спасибо!

ответ

2

stringWithFormat возвращает автореализованный объект. Вы должны сохранить его. Обратите внимание, что вы обращаетесь к директиве ivar, а не к свойству, чтобы строка не сохранялась. Используйте свойство вместо:

self.righta = [NSString stringWithFormat:@"A"]; 

Некоторые программисты предпочитают синтезировать свои свойства с другим именем Ивар, чтобы избежать доступа к Ивар непосредственно по ошибке.

@synthesize righta = righta_; 
+0

Я проголосовал за все 3 ответа, но получил это за то, что был самым полным. – RanLearns

+0

Основываясь на вашем ответе, я предполагаю, что вы также можете [righta сохранить]; и это должно сработать, но предпочтение свойства предпочтительнее ... просто устранить ненужные вызовы сохранения и освобождения? – RanLearns

+1

Да, это тоже сработает. Свойства предпочтительнее, поскольку они устраняют инкапсулирующее управление памятью. – albertamg

2

Вы должны использовать

self.righta = [NSString stringWithFormat:@"A"]; 

Чтобы назначить переменную в противном случае сбруя не используется, а значение не сохраняется.

+0

В качестве альтернативы вы можете использовать '[self setRighta: [NSString stringWithFormat: @" A "]];' Оба метода имеют одинаковый эффект (обращайтесь к методам setter, которые будут выполнять сохранение для вас). –

1

Изменить function1 на:

self.righta = [NSString stringWithFormat:@"A"]; 

Вы были назначая непосредственно к righta Ивар без сохранения строки.

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