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

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

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

要么

  NSMutableDictionary *alpha = [NSMutableDictionary dictionary]; 

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

推荐哪一种作为分配内存的最佳实践?

 [NSMutableDictionary dictionary]; 

与以下内容完全相同:

 [[[NSMutableDictionary alloc] init] autorelease]; 

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

公约是:

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

[NSMutableDictionary dictionary]NSMutableDictionary类的一个类方法。 它包含对allocinit的调用,就像手动执行它们一样。 由于这是一个非常常用的类,它的作者包括这个所谓的“工厂方法”,使他/她的class级的使用更容易。

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

至于哪个是好的做法,恕我直言,你应该使用工厂方法。 它使您自己的代码更具可读性,并节省您input的时间。 此外,尽pipe我不确定NSMutableDictionary是否属于这种情况 – 使用工厂方法可以使开发人员和您自己的维护都变得更容易,因为他们可以自由地更改具体的子类实现,而无需您改变你的应用程序代码

正确地指出它的评论,像这样的工厂方法返回自动释放对象的实例,所以如果你只在方法本地使用它们,没有必要担心从内存pipe理的angular度来看它们。 有关内存pipe理,autorelease以及带有自动引用计数function的新版ARC运行时的更多详细信息,您应该深入探究苹果有关该主题的文档(如果您还没有的话)。

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