NSDictionary字典vs init alloc vs new

时间:2013-05-06 22:42:05

标签: objective-c automatic-ref-counting

假设我想要使用NSMutableDictionary开始创建键/值对。然后,我似乎至少有三个选项来创建一个具有未指定容量的空的可变字典:

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

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

  

字典

     

创建并返回一个空字典。

     

+ (id)dictionary

     

返回值

     

一个新的空字典。

     

讨论

     

声明此方法主要用于可变子类   NSDictionary

     

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

我对此文档提出了几个问题:

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

其次,在这种背景下,“临时对象”是什么意思?

总结:与前两个相比,上面的第三个替代品之间是否存在差异?它可以something to doautoreleasing objects吗?这在自动引用计数(ARC)上下文中是否有效?

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

我正在使用XCode 4.6.1和iOS 6.1。使用ARC这几天我用的是哪个问题?也许从某种角度看绩效?

感谢您提供有关此的明确信息!

2 个答案:

答案 0 :(得分:12)

  

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

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

  

其次,在这种背景下,“临时对象”是什么意思?

好像是糟糕的文档。他们可能会说,如果您不想让它进入自动释放池,那么您可以使用alloc/init


如果您使用ARC,那么您选择的这三种方法中的任何一种都完全取决于个人偏好,因为它们的行为都相同。

如果你没有使用ARC,那么你应该在任何需要自动释放词典的时候使用+dictionary,并且只要你需要一本你要保留的词典就+alloc/init({1}}例如,将其放入ivar中,或者如果您只是想避免自动释放,并手动-release+new几乎从未在非ARC代码中使用过。

答案 1 :(得分:1)

1)所以你可以在任何一个地方使用它。拥有一本字典并不是很有用,但是如果你需要的话,它们会把它放进去。为什么不呢?

2)我认为它们是指不会在当前范围之外保留的对象。在ARC时代,这无关紧要。 init'd对象的保留计数始终为1,因此如果分配init(或new),则需要释放该对象。通常自动释放工厂方法的结果,因此您不必担心在范围结束时释放它。如果您想要使用+ dictionary方法的结果超出范围,则必须保留它。

总之,没关系。使用任何让你开心的东西。