Objective C / Cocoa中的构造函数有两种选择:
1。类构造函数
Product *product = [Product productWithIdentifier:@"Chocolate"];
// Use product
2。 Alloc / init构造函数
Product *product = [[Product alloc] initWithIdentifier:@"Chocolate"];
// Use product
[product release];
我做什么
我的问题
代码
对于上下文,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;
}
答案 0 :(得分:5)
将分配的对象分配给retain
属性;
当你创建“临时”对象时(想想从另一个字符串构建字符串的各种NSString
方法:在很多情况下,你需要“链接”这样的调用;构造函数允许你“忘记”内存管理);
将对象添加到保留它的某个对象时(想想:addSubview
)
在这种情况下,“类构造函数”的语法优势是最重要的,但我认为这也使您的代码在内存管理方面“更安全”。
另一方面,当您创建一个对象以将其分配给assign
属性(或直接分配给您没有属性的ivar)时,alloc/init
将完美地完成并且更可取到“建设者”(IMO)。
因此,最终,它取决于您使用所分配对象的方式。类构造函数是一种方便的方法。
答案 1 :(得分:5)
如果您使用的是ARC,那么两者之间没有那么大的区别。如果您不使用ARC,则差异非常重要。
alloc/init
组合为您提供了拥有参考。这意味着您以后必须release
。 classnameWithFoo
变体返回非拥有引用。你可能不会release
。
这遵循通常的Cocoa命名约定。除了以alloc
,copy
,mutableCopy
和new
开头的方法外,所有方法都返回非拥有(自动释放)实例。这些返回拥有的引用,您必须release
。
使用哪一个主要是品味问题。但是,如果您需要可以快速处理的临时对象alloc
变体导致方法调用(autorelease
)稍微减少,并且在循环中,它还会减少最大内存占用量。但是,在大多数情况下,这种降低的成本是可以忽略的。