NSInteger всегда ноль

У меня есть NSInteger, который всегда возвращает ноль :( Я объявил его так:

NSInteger level;
@property(nonatomic, assign) NSInteger level;

Синтез:

@synthesize fileName, filePath, theActualIndexPath, titleBar, level;

Затем при использовании NSLog(@"%d", level) всегда возвращает 0, даже после

level++; 

Or

level += 1;

Что я делаю неправильно? Я на 100% уверен, что добавлю 1 к level, но не могу понять, что не так :(

РЕДАКТИРОВАТЬ:

Оператор if, в котором я использую этот NSInteger

if (level == 0) {
    self.navigationItem.title = @"Test";

} else {
    self.navigationItem.title = self.titleBar;

}

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


person pmerino    schedule 09.12.2011    source источник
comment
Вы проверяли оперативную память на наличие повреждений? В противном случае этого не может произойти, когда вся информация, которую вы нам предоставили, верна.   -  person    schedule 09.12.2011
comment
хм, я сомневаюсь, что он поврежден, так как OS X и все приложения работают нормально. Единственный раз, когда я использую 0, это в операторе if и в NSLog, и, конечно, при попытке суммировать один, но это то, что не работает :(   -  person pmerino    schedule 09.12.2011
comment
Покажите @synthesize statement и остальную часть метода, связанного с настройкой и отображением уровня.   -  person zaph    schedule 09.12.2011
comment
Я не думаю, что проблема в этих строках кода. Вы пробовали менять компилятор (с gcc на llvm или наоборот)? очистить и построить? строить и анализировать?   -  person djromero    schedule 09.12.2011
comment
Я думаю, проблема в том, что я пытаюсь использовать многоуровневый навигационный контроллер. Для этого я снова выделяю тот же контроллер представления, и я думаю, что целое число уровня перераспределяется   -  person pmerino    schedule 09.12.2011


Ответы (3)


Почему вы объявляете level дважды?

Удалите эту строку: NSInteger level;

Первое объявление level — это глобальная переменная, второе — переменная экземпляра класса. В зависимости от области действия level, увеличиваемое ++level, отличается от level, которое печатается NSLog("%d", level); и проверяется if (level == 0).

ИЗМЕНИТЬ

да. Почему вы ожидаете, что level не будет заново выделено, если вы выделите другой экземпляр контроллера представления? Если вы хотите сделать это, вам нужно либо создать переменную static, которая разделяет ее между экземплярами одного и того же класса, либо убедиться, что вы делаете что-то вроде этого:

MyViewController *newViewController = [[MyViewController alloc] init]; // However this goes
newViewController.level = oldViewController.level; // Make sure you pass the level on
person john    schedule 09.12.2011
comment
Я думаю, проблема в том, что я пытаюсь использовать многоуровневый навигационный контроллер. Для этого я снова выделяю тот же контроллер представления, и я думаю, что целое число level перераспределяется - person pmerino; 09.12.2011

Изменяемая переменная — это не та переменная, к которой осуществляется доступ (в операторе if).

В консоли выведите значения и адреса level как там, где они устанавливаются (до и после), так и там, где осуществляется доступ к s (в операторе if.

person zaph    schedule 09.12.2011
comment
Я думаю, проблема в том, что я пытаюсь использовать многоуровневый навигационный контроллер. Для этого я снова выделяю тот же контроллер представления, и я думаю, что целое число уровня перераспределяется - person pmerino; 09.12.2011

Попробуйте это :
в .h

@property(nonatomic) NSInteger level; // not an object assign not needed

в них

@synthesize level = _level;  
self.level = self.level + 1;  // and try this

И удалить строку

NSInteger level;

Это работает?

person Vincent Bernier    schedule 09.12.2011
comment
Есть побочный эффект удаления объявления NSInteger level;, значение уровня (или в рекомендации _level) будет недоступно в отладчике. - person zaph; 09.12.2011
comment
Все еще не работает, даже изменил имя переменной на folderLevel, все равно не добавляет:/ - person pmerino; 09.12.2011
comment
почему «folderLevel» — красный флаг? - person pmerino; 09.12.2011
comment
folderLevel должен быть целым числом для отслеживания уровня иерархии папок в моем приложении. - person pmerino; 09.12.2011
comment
@ zad0xsis, вам нужно опубликовать больше кода, потому что многое может пойти не так, а ваш небольшой фрагмент кода этого не показывает. И с моим кодом вам АБСОЛЮТНО нужно использовать self, если вы тестируете напрямую для level без self это не сработает. И правило поворота: вы всегда должны использовать self.aProperty вместо того, чтобы постоянно обходить ваш метод доступа. (за исключением пользовательского средства доступа, где вам нужен прямой доступ) - person Vincent Bernier; 09.12.2011