Byt*_*Guy 10 macos cocoa objective-c
我班上有一个NSInteger就像这样
在@interface中:
NSInteger currentRow;
@property (assign) NSInteger currentRow;
Run Code Online (Sandbox Code Playgroud)
在@implementation中:
@synthesize currentRow;
Run Code Online (Sandbox Code Playgroud)
做[self setCurrentRow:0]似乎工作正常,但[self currentRow]由于某种原因使用只返回null,不知道为什么.当使用断点时,我可以看到它的值currentRow是0如此设置正常,但我无法获得该值.
pau*_*kow 16
在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]].| 归档时间: |
|
| 查看次数: |
9812 次 |
| 最近记录: |