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