【问题标题】:NSInteger set to 0 but returns nilNSInteger 设置为 0 但返回 nil
【发布时间】:2011-12-04 03:42:29
【问题描述】:

我的班级里有一个 NSInteger,就像这样

在@界面中:

NSInteger currentRow;    

@property (assign) NSInteger currentRow;

在@实现中:

@synthesize currentRow;

执行[self setCurrentRow:0] 似乎工作正常,但使用[self currentRow] 只是由于某种原因返回null,不知道为什么。使用断点时,我可以看到 currentRow 的值是 0,所以它设置得很好,但我无法取回该值。

【问题讨论】:

    标签: objective-c macos cocoa


    【解决方案1】:

    NSInteger 不是对象,它的类型定义为 int 或类似的东西。因此,如果您将 currentRow 设置为 0,然后尝试将其取回,则 null(也称为 0)是完全正确的值。

    【讨论】:

    • 这是一个分配而不是保留属性,所以它应该适用于非对象类型
    • 它有效!就内存中的实际值而言,null 和 0 是一回事。试试[self setCurrentRow:42],你会看到[self currentRow]返回42,只要确保你将结果分配给NSInteger,而不是一个对象。
    • 是的,使用非对象属性是完全有效的,只要您将它们定义为 assign 以便 sythesize 将跳过保留/释放舞蹈
    【解决方案2】:

    getter 方法将被合成为- (NSInteger)currentRow,所以它应该可以正常工作。但是你如何检查它是否有效?与NSLog(@"%@", ...)?比你应该使用%d

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-17
        • 2016-05-01
        • 2014-10-15
        • 1970-01-01
        • 1970-01-01
        • 2014-03-11
        • 2016-07-15
        相关资源
        最近更新 更多