【问题标题】:NSArray mutability and arrayByAddingObjectNSArray 可变性和 arrayByAddingObject
【发布时间】:2011-08-09 21:27:04
【问题描述】:

我以为我对 Objective-C 中的对象和可变性有很好的理解,但我注意到 NSArray 的一些奇怪之处。

如果我有以下不起作用:

NSArray *myArray = [ [[NSUserDefaults standardUserDefaults] arrayForKey:someKey] arrayByAddingObject:myObject ];

“myObject”永远不会添加到“myArray”中

但是,以下工作:

NSArray *someArray = [[NSUserDefaults standardUserDefaults] arrayForKey:someKey];
NSArray *myArray = [someArray arrayByAddingObject:myObject];

对此有何解释?我知道NSArray 是不可变的,但由于它是在初始分配期间,它应该可以工作,因为任何一种方式似乎都是等效的。

[[NSUserDefaults standardUserDefaults] arrayForKey:someKey] 返回一个NSArray

someArray 是一个NSArray

因此,NSArray 仅源自 [NSArray arrayByAddingObject:Object]

谢谢!

编辑 1

我只是想将NSArray 存储回NSUserDefaults

[[NSUserDefaults standardUserDefaults] setObject:myArray forKey:someKey];

它从来没有正确存储它,所以当我调试时,我发现在创建数组时从未添加过“myObject”。

注意:我只测试了 [[NSUserDefaults standardUserDefaults] arrayForKey:someKey] 返回一个空/nil 数组

编辑 2

我已经将这个问题隔离了一点; 只有在[NSUserDefaults standardUserDefaults] arrayForKey:someKey] 返回“nil”时才会发生这种情况(基本上,NSUserDefaults 中不存在该数组)。 我仍然很想知道为什么这对于我拥有的第二个代码解决方案来说不是问题。

【问题讨论】:

  • 这两个表达式是相同的。定义“不起作用”;即粘贴您如何测试它的示例。
  • 我添加了更多关于分配后如何使用 NSArray 的详细信息。
  • 这两个表达式是相同的;如果 NSUserDefaults 返回nil,那么myArray 将永远是nil。如果不是这种情况,那是因为 NSUserDefaults 在您认为它是 nil 时返回了一个非零值,或者您没有向我们展示所有代码。
  • 对我来说,如果之前已设置数组,您的第一个解决方案效果很好。

标签: objective-c nsarray


【解决方案1】:

您如何检查是否添加了 myObject?两个代码示例看起来都不错,我当然毫无问题地使用了前者。但你所有的假设都是正确的。问题,如果确实有一个,在别处。

【讨论】:

    【解决方案2】:

    这应该是预期的行为

    如果你在 Objective-C 中调用 nil 上的方法,你总是得到 nil(或 NO/0)作为你的返回值

    在这种情况下,当调用NSArray *myArray = [ [[NSUserDefaults standardUserDefaults] arrayForKey:someKey] arrayByAddingObject:myObject ]; 时,如果someKey 未在NSUserDefaults 中设置,那么您调用的是[nil arrayByAddingObject:],因此预计会返回nil

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多