В 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]]
.