微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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]]设置它.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐