2012-03-20 2 views
2

Вот часть определения класса в программе IOS, используя подсчет ссылок (ARC):Странное поведение с переменной экземпляра NSString

@interface CapViewController : UIViewController 
{ 
    NSString *bottomBn; 
    NSString *topBn; 
} 

@property (nonatomic, strong) NSString *bottomBn; 
@property (nonatomic, strong) NSString *topBn; 

@end 

В реализации я синтезировать их:

@implementation CapViewController 

@synthesize bottomBn; 
@synthesize topBn; 

Проблема когда я пытаюсь присвоить значения. Если я пошагово следующие строки в метод класса (первый раз каждая переменная экземпляра используется):

bottomBn = [NSString stringWithString:@"bottomBn"];   
topBn = [NSString stringWithString:@"topBn"]; 

После того, как первая линия выполнена, значение topBn становится @ «bottomBn» и bottomBn равна нулю Вторая линия не влияет.

Если изменить порядок, в котором переменные экземпляра, определенные в классе, т.е .:

NSString *topBn; 
NSString *bottomBn; 

тогда первая уступка не имеет никакого эффекта, а второй результат присваивания в «topBn» быть назначен bottomBn.

Использование локальных переменных это работает, как ожидалось:

NSString *localbottomBn = [NSString stringWithString:@"defaultbottombutton"];   
NSString *localtopBn = [NSString stringWithString:@"defaulttopbutton"]; 

Это кажется странное поведение для меня. Буду признателен за любую помощь.

+0

Можете ли вы разместить больше кода, окружающего строки, где вы их установили? Если бы вы могли опубликовать полный, минимальный тестовый пример, который можно было бы использовать для воспроизведения проблемы, это тоже помогло бы. –

+0

Текущая версия lldb имеет серьезную ошибку с отображением значений ivars. См. Http://stackoverflow.com/questions/9533189/objective-c-object-nil-after-init и http://stackoverflow.com/questions/9408219/debugger-lldb-says-my-object-is-nil -when-is-not –

ответ

0

У меня есть такие же проблемы с другими типами и объектами (даже CGFloat и CGPoint). Я думаю, проблема в отладчике. Попробуйте напечатать строки, а не искать переменные через отладчик. Для меня функция NSLog печатает то, что я ожидал.

У меня нет идей, почему отладчик имеет это непредсказуемое поведение (может быть, это ошибка), но теперь я предпочитаю «отладку NSLog». Это грустно.

+0

Не могу поверить, что я потратил столько времени на это. Вы абсолютно правы. Значения, отображаемые в окне отладчика (т. Е. Выше), отличаются от значений, выводимых NSLog. Когда я печатаю через NSLog, я получаю точные значения, которые я ожидал бы. – Bknee

+0

Да, я потратил пару часов и много нервов. Я столкнулся с этой проблемой только после последнего обновления xCode, поэтому я думаю, что это ошибка яблок. – Lloyd18

7

Вы не устанавливая autoreleased строки, вы должны установить строки, как:

self.bottomBn = [NSString stringWithString:@"bottomBn"];   
self.topBn = [NSString stringWithString:@"topBn"]; 
+0

Спасибо за ответ. Я сделал изменения, но проблема осталась. Ответ Lloyd18 был решением ... окна отладки/просмотра отображали неустойчивые значения. NSLog показал правильные значения. При этом я внес изменения, которые вы предложили, чтобы улучшить код. Благодаря! – Bknee

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