Вы можете сделать это следующим образом:
setTimeout(printer, 1000, name)
В 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]]
. Метод геттера будет синтезирован как - (NSInteger)currentRow
, поэтому он должен работать нормально. Но как вы проверяете, работает ли это? С NSLog(@"%@", ...)
? Чем вы должны использовать %d
.
Если вы хотите, чтобы это был объект, вы должны использовать свойство NSNumber
и retain
.
NSInteger не является объектом, это typedef'd для int или что-то в этом роде. Таким образом, если вы установите currentRow равным 0, а затем попытайтесь вернуть его, значение null (aka 0) будет полностью правильным.
[self setCurrentRow:42]
, вы увидите, что [self currentRow]
возвращает 42, просто убедитесь, что вы назначаете результат NSInteger, а не объекту.
– Nicky
10 October 2011 в 00:28
assign
, чтобы синтез пропускал танец сохранения / выпуска
– Mattias Wadman
10 October 2011 в 00:34