17

例如,假设我想开始使用NSMutableDictionary. 然后,我似乎至少有三个选项可以创建具有未指定容量的空的、可变的字典:

NSMutableDictionary *mutDict = [[NSMutableDictionary alloc] init]; // 1
NSMutableDictionary *mutDict = [NSMutableDictionary new];          // 2
NSMutableDictionary *mutDict = [NSMutableDictionary dictionary];   // 3

现在,据我了解,[NSObject new]实际上(如果不完全是?)与[[NSObject alloc] init]. 因此,就我而言,我们基本上可以合并这两个选项。不过,关于该[NSDictionary dictionary]方法,文档说:

字典

创建并返回一个空字典。

+ (id)dictionary

返回值

一个新的空字典。

讨论

声明此方法主要用于 NSDictionary.

如果您不想要临时对象,还可以使用alloc...and创建一个空字典init

首先,我有几个关于此文档的问题:

首先,为什么它甚至在 NSDictionary 而不是 NSMutableDictionary 中声明,如果那是它打算使用的地方?

其次,在这种情况下,他们所说的“临时对象”是什么意思?

总结:与前两种相比,上面的第三种选择有区别吗?它可能与自动释放对象有关?这在自动引用计数 (ARC) 上下文中是否重要?

请注意,此问题也适用于其他类,例如[NSData data][NSArray array]

我正在使用 XCode 4.6.1 和 iOS 6.1。这些天我使用哪一个,使用 ARC 有关系吗?也许从性能的某些角度来看?

感谢您对此提供任何明确的信息!

4

2 回答 2

12

首先,为什么它甚至在 NSDictionary 而不是 NSMutableDictionary 中声明,如果那是它打算使用的地方?

因为获取空NSDictionary对象仍然很有用。预计它将主要与 一起使用NSMutableDictionary,但这并不意味着它永远不能与NSDictionary.

其次,在这种情况下,他们所说的“临时对象”是什么意思?

似乎是糟糕的文档。他们可能的意思是,如果您不希望它进入自动释放池,那么您可以使用alloc/init.


如果您使用的是 ARC,那么您选择的这 3 种方法中的哪一种完全是个人喜好,因为它们的行为都相同。

如果您不使用 ARC,那么您应该+dictionary在需要自动发布的字典的+alloc/init任何时候使用,并且在需要保留的字典的任何时候使用(例如,通过将其放在 ivar 中),或者如果您只是想避免自动释放和-release手动。+new几乎从不在非 ARC 代码中使用。

于 2013-05-06T22:49:48.623 回答
1

1)所以你可以在任何一个地方使用它。只拥有一本字典并不是很有用,但他们会把它放进去,这样你就可以在需要时使用。为什么不?

2)我认为它们的意思是一个不会保留在当前范围之外的对象。在 ARC 时代,这不再重要了。一个 init 对象的保留计数始终为 1,因此如果您分配 init(或 new),则需要释放该对象。自动释放工厂方法的结果是传统的做法,因此您无需担心在作用域结束时释放它。如果您想在范围外使用 +dictionary 方法的结果,则必须保留它。

所以总而言之,没关系。使用任何让你快乐的东西。

于 2013-05-06T22:50:00.767 回答