2011-04-20 113 views
3

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

如果我有不工作的情况如下:

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:对象]

谢谢!

编辑1

我只是想存储的NSArray回NSUserDefaults的:

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

这是从来没有存放得当,所以当我调试我看到“myObject的”从来没有被在数组创建时添加。

注:我只被测试与[[NSUserDefaults的standardUserDefaults] arrayForKey:someKey]返回空/无阵列

编辑2

我已经分离出的问题有点; 只有在[NSUserDefaults standardUserDefaults] arrayForKey:someKey]返回“nil”(基本上,该数组在NSUserDefaults中不存在)时才会发生。 我仍然很想知道为什么它不是第二代码解决方案的问题。

+0

两个表达式是相同的。定义“不起作用”;即粘贴您如何测试它的示例。 – bbum 2011-04-20 23:47:24

+0

我已经添加了更多关于如何在赋值后使用NSArray的详细信息。 – aSadhankar 2011-04-21 20:21:36

+0

这两个表达式是相同的;如果NSUserDefaults返回'nil',那么'myArray'将始终为'nil'。如果情况并非如此,那么可能是因为NSUserDefaults在您认为它为'nil'时返回非零值,或者您没有向我们显示所有代码。 – bbum 2011-04-24 20:58:06

回答

0

您如何查看是否添加了myObject?这两个代码示例看起来都很好,而且我确实使用了前者而没有任何问题。但是你所有的假设都是正确的。这个问题,如果确实存在的话,在别处。

0

这应该是预期的行为

如果您在Objective-C调用一个方法上nil,你总是零(或NO/O)为您的返回值

在这种情况下,当调用NSArray *myArray = [ [[NSUserDefaults standardUserDefaults] arrayForKey:someKey] arrayByAddingObject:myObject ];,如果someKeyNSUserDefaults设置,那么你打电话[nil arrayByAddingObject:],因此期望得到nil