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

Joh*_*her 6 constructor memory-management objective-c

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

1.类构造函数

Product *product = [Product productWithIdentifier:@"Chocolate"];
// Use product
Run Code Online (Sandbox Code Playgroud)

2. Alloc/init构造函数

Product *product = [[Product alloc] initWithIdentifier:@"Chocolate"];
// Use product
[product release];
Run Code Online (Sandbox Code Playgroud)

我所做的

  • 我倾向于使用类方法只是因为它看起来更干净而且你不需要发布.
  • 我看到很多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;
}
Run Code Online (Sandbox Code Playgroud)

ser*_*gio 5

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

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

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

  3. 当您添加对象的一些对象,保留它(认为:addSubview)

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

另一方面,当您创建一个对象以将其分配给assign属性(或直接分配给您没有属性的ivar)时,alloc/init将完美地做到并且优于"构造函数"(IMO).

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


Dar*_*ust 5

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

alloc/init组合为您提供了一个拥有参考.这意味着你release以后必须这样做.该classnameWithFoo变种会返回一个非所属的参考.你可能没有release.

这遵循通常的Cocoa命名约定.所有方法返回非所属(自动释放)的情况下,除了与启动方法alloc,copy,mutableCopynew.这些返回您必须拥有的引用release.

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