Int установлено в 0, но отображается nil [duplicate]

Вы можете сделать это следующим образом:

setTimeout(printer, 1000, name)
9
задан BytesGuy 27 January 2013 в 23:39
поделиться

3 ответа

В 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.
  • re, используя NSLog("%@", currentRow), измените его на NSLog(%"ld", (long)currentRow).
  • Если вы используете currentRow в другом месте, где требуется объект, измените вашу переменную экземпляра и типы свойств на NSNumber *, тип объекта. Установите его с помощью [self setCurrentRow:[NSNumber numberWithInt:0]].
16
ответ дан paulmelnikow 22 August 2018 в 11:43
поделиться

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

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

3
ответ дан Mattias Wadman 22 August 2018 в 11:43
поделиться

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

6
ответ дан Nicky 22 August 2018 в 11:43
поделиться
  • 1
    Это присваивание не сохраняемое свойство, поэтому оно должно работать с не-объектными типами – Mattias Wadman 10 October 2011 в 00:03
  • 2
    И это работает! Что касается фактического значения в памяти, то null и 0 - одно и то же. Попробуйте [self setCurrentRow:42], вы увидите, что [self currentRow] возвращает 42, просто убедитесь, что вы назначаете результат NSInteger, а не объекту. – Nicky 10 October 2011 в 00:28
  • 3
    Да, это полностью справедливо для использования свойств, которые не являются объектами, если вы определяете их как assign, чтобы синтез пропускал танец сохранения / выпуска – Mattias Wadman 10 October 2011 в 00:34