假设我想要使用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 do与autoreleasing objects吗?这在自动引用计数(ARC)上下文中是否有效?
请注意,此问题也适用于其他类,例如[NSData data]
和[NSArray array]
。
我正在使用XCode 4.6.1和iOS 6.1。使用ARC这几天我用的是哪个问题?也许从某种角度看绩效?
感谢您提供有关此的明确信息!
答案 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方法的结果超出范围,则必须保留它。
总之,没关系。使用任何让你开心的东西。