为什么要使用类方法构造函数而不是alloc / init?

时间:2012-02-19 14:31:55

标签: objective-c memory-management constructor

Objective C / Cocoa中的构造函数有两种选择:

1。类构造函数

Product *product = [Product productWithIdentifier:@"Chocolate"];
// Use product

2。 Alloc / init构造函数

Product *product = [[Product alloc] initWithIdentifier:@"Chocolate"];
// Use product
[product release];

我做什么

  • 我倾向于使用class方法,因为它看起来更干净,而且你不需要发布。
  • 我看到很多alloc / init - 这样做有什么好处?

我的问题

  • 哪一个更好?或者只是品味问题?

代码

对于上下文,Product类将具有以下内容:

+(Product *)productWithIdentifier:(NSString *)identifier_ {
   return [[[[self class] alloc] initWithIdentifier:identifier] autorelease];
}

-(Product *)initWithIndentifier:(NSString *)identifier_ {
   self = [super init]
   if (self) {
       identifier = identifier_;
   }
   return self;
}

2 个答案:

答案 0 :(得分:5)

IMO,这两种方法之间的最大区别在于使用“类构造函数”得到一个自动释放的对象;这是您最方便的选择:

  1. 将分配的对象分配给retain属性;

  2. 当你创建“临时”对象时(想想从另一个字符串构建字符串的各种NSString方法:在很多情况下,你需要“链接”这样的调用;构造函数允许你“忘记”内存管理);

  3. 将对象添加到保留它的某个对象时(想想:addSubview

  4. 在这种情况下,“类构造函数”的语法优势是最重要的,但我认为这也使您的代码在内存管理方面“更安全”。

    另一方面,当您创建一个对象以将其分配给assign属性(或直接分配给您没有属性的ivar)时,alloc/init将完美地完成并且更可取到“建设者”(IMO)。

    因此,最终,它取决于您使用所分配对象的方式。类构造函数是一种方便的方法。

答案 1 :(得分:5)

如果您使用的是ARC,那么两者之间没有那么大的区别。如果您不使用ARC,则差异非常重要。

alloc/init组合为您提供了拥有参考。这意味着您以后必须releaseclassnameWithFoo变体返回非拥有引用。你可能不会release

这遵循通常的Cocoa命名约定。除了以alloccopymutableCopynew开头的方法外,所有方法都返回非拥有(自动释放)实例。这些返回拥有的引用,您必须release

使用哪一个主要是品味问题。但是,如果您需要可以快速处理的临时对象alloc变体导致方法调用(autorelease)稍微减少,并且在循环中,它还会减少最大内存占用量。但是,在大多数情况下,这种降低的成本是可以忽略的。