NSArray 可变性和 arrayByAddingObject
我以为我对 Objective-C 中的对象和可变性有很好的理解,但我注意到 NSArray
有一些奇怪的东西.
I thought I had a good understanding of Objects and mutability in Objective-C but I've noticed something curious with NSArray
.
如果我有以下不起作用:
If I have the following that doesn't work:
NSArray *myArray = [ [[NSUserDefaults standardUserDefaults] arrayForKey:someKey] arrayByAddingObject:myObject ];
myObject"永远不会添加到myArray".
但是,以下有效:
NSArray *someArray = [[NSUserDefaults standardUserDefaults] arrayForKey:someKey];
NSArray *myArray = [someArray arrayByAddingObject:myObject];
这是什么解释?我知道 NSArray
不是可变的,但因为它是在初始分配期间,所以它应该可以工作,因为任何一种方式似乎都是等效的.
What's the explanation for this? I know that NSArray
is not mutable but since it is during the initial assignment, it should work since either way seems equivalent.
[[NSUserDefaults standardUserDefaults] arrayForKey:someKey]
返回一个 NSArray
someArray 是一个 NSArray
someArray is an NSArray
因此,NSArray
简单地从 [NSArray arrayByAddingObject:Object]
谢谢!
编辑 1
我只是想将 NSArray
存储回 NSUserDefaults
:
I am simply wanting to store the NSArray
back to NSUserDefaults
:
[[NSUserDefaults standardUserDefaults] setObject:myArray forKey:someKey];
它从未正确存储它,因此当我调试时,我看到创建数组时从未添加myObject".
It was never storing it properly, and so when I debugged I saw that "myObject" was never being added when the array was created.
注意:我只测试了 [[NSUserDefaults standardUserDefaults] arrayForKey:someKey]
返回一个空/nil
数组
Note: I have only been testing with [[NSUserDefaults standardUserDefaults] arrayForKey:someKey]
returning a empty/nil
array
编辑 2
我已经隔离了这个问题;这仅在 [NSUserDefaults standardUserDefaults] arrayForKey:someKey]
返回nil" 时才会发生(基本上,NSUserDefaults
中不存在该数组).我仍然很想知道为什么我拥有的第二个代码解决方案不是问题.
I've isolated the issue a bit; this only happens if [NSUserDefaults standardUserDefaults] arrayForKey:someKey]
returns "nil" (basically, the array doesn't exist in NSUserDefaults
).
I'm still curious to know though why it's not an issue for the 2nd code solution I have.
这应该是预期的行为
如果你在 Objective-C 中调用 nil
上的方法,你总是得到 nil(或 NO/0)作为你的返回值
If you call a method on nil
in Objective-C, you always get nil (or NO/0) as your return value
在这种情况下,当调用 NSArray *myArray = [ [[NSUserDefaults standardUserDefaults] arrayForKey:someKey] arrayByAddingObject:myObject ];
时,如果 someKey
未设置NSUserDefaults
,那么你正在调用 [nil arrayByAddingObject:]
并且希望得到 nil
返回
In this case, when calling NSArray *myArray = [ [[NSUserDefaults standardUserDefaults] arrayForKey:someKey] arrayByAddingObject:myObject ];
, if someKey
isn't set in NSUserDefaults
, then you're calling [nil arrayByAddingObject:]
and so would expect to get nil
back