NSDictionary + dictionaryWithDictionary或-copy?

mat*_*hat 11 objective-c foundation

这被认为是从原始字典派生新字典的更好方法:

[NSDictionary dictionaryWithDictionary:otherDictionary];
Run Code Online (Sandbox Code Playgroud)

要么

[otherDictionary copy];
Run Code Online (Sandbox Code Playgroud)

我们不时需要用一个不可变的字符来制作一个可变字典,所以这个问题一直存在.也许没有,但我很想知道在某些用例中是否有一个比另一个好.

编辑:我知道上述方法不能用于派生可变字典.我只是想以一般方式提出问题,然后解释我每天如何面对这个问题.我应该更清楚这一点.

Dav*_*ong 33

实际上,它们不同的,但不是因为你期望的原因.我假设你正在使用ARC(如果你不是,为什么不呢?),所以返回对象的自动释放无关紧要.

下面是它们之间的区别:考虑是否发生了什么otherDictionarynil.

好吧,如果你使用:

[otherDictionary copy]; // or -mutableCopy
Run Code Online (Sandbox Code Playgroud)

你会回来的nil,因为你有一个nil接收器.

另一方面,如果您使用:

[NS(Mutable)Dictionary dictionaryWithDictionary:otherDictionary];
Run Code Online (Sandbox Code Playgroud)

回来的NS(Mutable)Dictionary,无论otherDictionarynil或不是.

这在你需要创建字典副本并且NSDictionary之后需要实例的情况下很好,但你不想测试nil(为了减少圈复杂度!).

  • 也就是说,先生,非常好的捕获.而且,为了指出选择其中一个的实际原因,你应该得到勾选标记. (2认同)
  • iOS 9.0 标头将 `dictionaryWithDictionary:` 的参数标记为(隐式)`_Nonnull`。这只是一个疏忽,还是苹果说不应该依赖过去带有“nil”参数的行为? (2认同)

mip*_*adi 7

这个问题有几个方面:

首先,这两者略有不同:

[NSDictionary dictionaryWithDictionary:otherDictionary];    #1
[otherDictionary copy];                                     #2
Run Code Online (Sandbox Code Playgroud)

#1返回一个自动释放的对象(即一个具有+0保留计数的对象); #2返回一个具有+1保留计数的对象,因此调用者负责release在某个时刻进行调用.

(如果otherDictionary是,它们也略有不同nil:#1返回一个空字典,而#2返回nil.)

当然,在你的问题中,你实际上是在询问可变副本.请注意,您可以执行以下任一操作:

[NSMutableDictionary dictionaryWithDictionary:otherDictionary];
[otherDictionary mutableCopy];
Run Code Online (Sandbox Code Playgroud)

与上述相同的警告适用于这些方法中的每一种.

本身可能没有最好的方法,但是mutableCopy最清楚(只记得你必须在某个时候释放保留的对象).