这两种在Objective-C中分配内存的方法有什么区别?

时间:2011-11-21 11:30:06

标签: iphone objective-c ios memory-management

我对在Objective-C中分配内存的正确方法感到困惑。假设我有一个NSMutableDictionary。我可以通过两种方式初始化它:

   NSMutableDictionary *alpha = [[NSMutableDictionary alloc] init];

   NSMutableDictionary *alpha = [NSMutableDictionary dictionary];

他们之间有什么区别?我知道第一个为alpha分配内存,但第二个呢?

建议将哪一项作为分配内存的最佳做法?

3 个答案:

答案 0 :(得分:5)

[NSMutableDictionary dictionary];

与以下内容完全相同:

[[[NSMutableDictionary alloc] init] autorelease];

它只会为您节省一些打字费用。只要您知道保留对象和自动释放对象之间的区别,您使用哪一个并不重要。如果您正在使用ARC,那么您甚至不需要知道它。

惯例是:

  1. 如果您看到 init 复制:它是一个保留对象。
  2. 如果方法名称以类名开头(没有框架前缀),则它是一个自动释放的对象。

答案 1 :(得分:2)

[NSMutableDictionary dictionary]NSMutableDictionary类的类方法。它包含对allocinit的调用,就像您手动执行调用一样。由于这是一个非常常用的类,它的作者包括了这个所谓的“工厂方法”,以使他/她的班级用户的生活更轻松。

有关此模式的详细信息,请参阅http://en.wikipedia.org/wiki/Factory_method_pattern

至于哪个是好习惯,恕我直言,你应该使用工厂方法。它使您自己的代码更具可读性并节省您的输入。此外 - 虽然我不确定NSMutableDictionary是否属于这种情况 - 使用工厂方法使开发人员和您自己的维护更容易,因为它们是e。 G。可以自由更改您将从工厂收到的具体子类实现,而无需更改应用程序代码。

正确地指出了注释,像这样的工厂方法返回自动释放的对象实例,因此如果你只在方法中本地使用它们,则无需从内存管理的角度来担心它们。有关内存管理,自动释放和带有自动引用计数的新ARC运行时的更多详细信息,您应该深入了解Apple关于该主题的文档(如果您还没有)。

答案 2 :(得分:1)

两行都会为alpha分配内存,区别在于第二个alpha是自动释放对象。