@interface Foo : NSObject
@property (nonatomic, retain) Bar * bar;
@end
@implementation Foo
@synthesize bar = _bar;
- init {
self = [super init];
if (self) {
_bar = [[Bar alloc] init];
// Or
_bar = [[[Bar alloc] init] autorelease];
}
return self;
}
- (void)dealloc {
[_bar release];
[super dealloc];
}
@end
当我运行分析仪时,两者
_bar = [[Bar alloc] init];
和
_bar = [[[Bar alloc] init] autorelease];
很好。
我应该使用哪一个?
答案 0 :(得分:4)
你应该使用第一个。它创建一个保留对象,而第二个“自动释放”保留。
重要的考虑因素是你将它分配给实例变量_bar。相反,如果您将其分配给属性self.bar
,则属性声明中的retain
指令将导致保留该对象,因此分配自动释放的值将是合适的。但是,由于你要分配给“裸”实例变量,你需要自己处理保留,所以你需要第一个表格。
PPS:应该注意,此处的选择是高度依赖于上下文。但是你包含了足够的上下文(属性定义)来做出选择。如果没有看到属性定义(或非属性的其他信息),就很难说。
答案 1 :(得分:2)
autorelease
版本不正确,可能会在某些情况下导致崩溃 - 您的第一行导致_bar
保留计数为1
,因此会一直保持release
-dealloc
当你不再需要它时,{}}} {}}}。
然而,第二行很快释放了对象(特别是在运行循环结束时),因此当你仍然需要它时它会消失。