NSDictionary字典vs init alloc vs new

Vic*_*ian 16 objective-c automatic-ref-counting

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

NSMutableDictionary *mutDict = [[NSMutableDictionary alloc] init]; // 1
NSMutableDictionary *mutDict = [NSMutableDictionary new];          // 2
NSMutableDictionary *mutDict = [NSMutableDictionary dictionary];   // 3
Run Code Online (Sandbox Code Playgroud)

现在,正如我所理解的那样,[NSObject new]实际上(如果不完全相同)是相同的[[NSObject alloc] init].因此,就我而言,我们基本上可以合并这两个选项.但是关于[NSDictionary dictionary]方法,文档说:

字典

创建并返回一个空字典.

+ (id)dictionary

回报价值

一个新的空字典.

讨论

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

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

关于此文档,我有几个问题要问:

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

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

总结:与前两个相比,上面的第三个替代方案之间是否存在差异?难道有事情做自动释放的对象?这在自动引用计数(ARC)上下文中是否有效?

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

我正在使用XCode 4.6.1和iOS 6.1.使用ARC,这些天我使用哪一个是否重要?也许从某些角度来看表现?

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

Lil*_*ard 12

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

因为获取空NSDictionary对象仍然有用.它预计会主要用于NSMutableDictionary,但这并不意味着它永远不会被使用NSDictionary.

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

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


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

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