NSInteger设置为0但返回nil

时间:2011-10-09 22:29:27

标签: objective-c macos cocoa

我班上有一个NSInteger就像这样

在@interface中:

NSInteger currentRow;    

@property (assign) NSInteger currentRow;

在@implementation中:

@synthesize currentRow;

执行[self setCurrentRow:0]似乎工作正常,但使用[self currentRow]只是因为某些原因返回null,不确定原因。使用断点时,我可以看到currentRow的值为0,因此设置正常,但我无法获得该值。

3 个答案:

答案 0 :(得分:16)

在Objective-C中,区分对象和基本类型非常重要。

对象始终存储为指针,这是对象在内存中的位置。指针只是一个数字。使用NSLog,您可以使用%p查看此值。您也可以在调试器中显示它,如下所示:print myObject。指针显示为十六进制数字,前缀为0xnil基本上是位置零(0x0000)。当你分配任何类型的对象时,你会得到一个非零的指针。将对象分配给变量时,只需复制内存地址,而不是复制对象。使用NSLog,您可以使用%@打印出对象的description。在调试器中,如下所示:print-object myObject

像<{1}}这样的

原始类型不是对象。通常只存储值,而不是存储指针。分配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

如果您希望它成为对象,则应使用NSNumberretain属性。