我班上有一个NSInteger就像这样
在@interface中:
NSInteger currentRow;
@property (assign) NSInteger currentRow;
在@implementation中:
@synthesize currentRow;
执行[self setCurrentRow:0]
似乎工作正常,但使用[self currentRow]
只是因为某些原因返回null,不确定原因。使用断点时,我可以看到currentRow
的值为0
,因此设置正常,但我无法获得该值。
答案 0 :(得分:16)
在Objective-C中,区分对象和基本类型非常重要。
对象始终存储为指针,这是对象在内存中的位置。指针只是一个数字。使用NSLog
,您可以使用%p
查看此值。您也可以在调试器中显示它,如下所示:print myObject
。指针显示为十六进制数字,前缀为0x
。 nil
基本上是位置零(0x0000
)。当你分配任何类型的对象时,你会得到一个非零的指针。将对象分配给变量时,只需复制内存地址,而不是复制对象。使用NSLog
,您可以使用%@
打印出对象的description
。在调试器中,如下所示:print-object myObject
。
原始类型不是对象。通常只存储值,而不是存储指针。分配NSInteger
变量时,可以复制该值。您可以使用NSInteger
在调试器中查看值。或者像这样:print
。分配基元时,复制其值。不要将NSLog("%ld", (long)currentRow)
或%@
与原语一起使用 - 它们需要对象。
(我说“通常你只是存储值”,因为你也可以指出原始类型的指针。在像你这样的情况下,它是没有必要的。)
print-object
返回0,就像你设置它一样。 (此外,因为Objective-C保证实例变量的初始化,即使你没有设置它,它也会返回0。)
问题在于您期望指向对象的指针。如何修复代码取决于您的使用方式:
[self currentRow]
,请将其更改为print-object currentRow
。print currentRow
,请将其更改为NSLog("%@", currentRow)
。NSLog(%"ld", (long)currentRow)
,请将实例变量和属性类型更改为对象类型currentRow
。使用NSNumber *
。答案 1 :(得分:6)
NSInteger不是对象,它的类型为int或类似的东西。因此,如果将currentRow设置为0然后尝试将其恢复,则null(aka 0)是完全正确的值。
答案 2 :(得分:4)
getter方法将合成为- (NSInteger)currentRow
,因此它应该可以正常工作。但是你如何检查它是否有效?使用NSLog(@"%@", ...)
?你应该使用%d
。
如果您希望它成为对象,则应使用NSNumber
和retain
属性。