objective-c – NSInteger设置为0但返回nil

我班上有一个NSInteger就像这样

在@interface中:

NSInteger currentRow;    

@property (assign) NSInteger currentRow;

在@implementation中:

@synthesize currentRow;

做[self setCurrentRow:0]似乎工作正常,但使用[self currentRow]只是因某种原因返回null,不知道为什么.当使用断点时,我可以看到currentRow的值为0,因此设置正常,但我无法获得该值.

解决方法

在Objective-C中,区分对象和基本类型很重要.

对象始终存储为指针,该指针是对象在内存中的位置.指针只是一个数字.使用NSLog,您可以使用%p来查看此值.您也可以在调试器中显示它,如下所示:print myObject.指针显示为十六进制数字,带有0x前缀. nil基本上是位置零(0x0000).当你分配任何类型的对象时,你会得到一个非零的指针.将对象分配给变量时,只需复制内存地址,而不是复制对象.使用NSLog,您可以使用%@打印对象的描述.在调试器中,如下所示: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]]设置它.

相关文章

我正在用TitaniumDeveloper编写一个应用程序,它允许我使用Ja...
我的问题是当我尝试从UIWebView中调用我的AngularJS应用程序...
我想获取在我的Mac上运行的所有前台应用程序的应用程序图标....
我是一名PHP开发人员,我使用MVC模式和面向对象的代码.我真的...
OSX中的SetTimer在Windows中是否有任何等效功能?我正在使用...
我不确定引擎盖下到底发生了什么,但这是我的设置,示例代码和...