NSInteger установлен в 0, но возвращает ноль - PullRequest
9 голосов
/ 10 октября 2011

У меня в классе NSInteger вот так

В @interface:

NSInteger currentRow;    

@property (assign) NSInteger currentRow;

В @implementation:

@synthesize currentRow;

Кажется, что [self setCurrentRow:0]работает нормально, но использование [self currentRow] просто возвращает null по какой-то причине, не знаю почему.При использовании точек останова я вижу, что значение для currentRow равно 0, поэтому он установил нормально, но я не могу получить значение обратно.

Ответы [ 3 ]

16 голосов
/ 11 октября 2011

В Objective-C важно различать объекты и типы примитивов.

объект всегда хранится как указатель, который является местоположением объекта в памяти.Указатель - это просто число.С NSLog вы можете использовать %p, чтобы увидеть это значение.Вы также можете отобразить его в отладчике, например так: print myObject.Указатель отображается в виде шестнадцатеричного числа с префиксом 0x.nil по существу является нулевым местоположением (0x0000).Когда вы выделяете какой-либо объект, вы получите указатель, который не равен нулю.Когда вы назначаете объект переменной, вы просто копируете адрес памяти, а не дублируете объект.С NSLog вы можете использовать %@, чтобы распечатать объект description.В отладчике вот так: print-object myObject.

Примитивные типы , подобные NSInteger, не являются объектами.Вместо того, чтобы хранить указатель, обычно вы просто сохраняете значение.Когда вы назначаете переменную NSInteger, вы копируете значение.Вы можете увидеть значение в отладчике, используя print.Или вот так: NSLog("%ld", (long)currentRow).Когда вы назначаете примитив, вы копируете его значение.Не используйте %@ или print-object с примитивами - они ожидают объекты.

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

[self currentRow] возвращает 0, так же, как вы его установили.(Более того, поскольку Objective-C гарантирует инициализацию переменных экземпляра, он вернет 0, даже если вы не установите его.)

Проблема в том, что вы ожидаете указательк объекту.Способ исправления кода зависит от того, как вы его используете:

  • Если вы используете print-object currentRow, измените его на print currentRow.
  • Если вы используетеNSLog("%@", currentRow), измените его на NSLog(%"ld", (long)currentRow).
  • Если вы используете currentRow где-то еще, где требуется объект, измените переменную вашего экземпляра и типы свойств на NSNumber *, тип объекта.Установите его с помощью [self setCurrentRow:[NSNumber numberWithInt:0]].
6 голосов
/ 10 октября 2011

NSInteger - это не объект, это typedef'd для int или что-то в этом роде.Таким образом, если вы установите значение currentRow равным 0, а затем попытаетесь вернуть его обратно, значение null (иначе 0) будет полностью правильным значением.

4 голосов
/ 10 октября 2011

Метод получения будет синтезирован как - (NSInteger)currentRow, поэтому он должен работать просто отлично. Но как проверить, работает ли он? С NSLog(@"%@", ...)? Чем вы должны использовать %d.

Если вы хотите, чтобы это был объект, вы должны использовать NSNumber и свойство retain.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...