0
@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];

没事。

我应该使用哪一个?

4

2 回答 2

4

你应该使用第一个。它创建一个保留对象,而第二个“自动释放”保留。

重要的考虑因素是将其分配给实例变量 _bar。相反,如果您将其分配给 property self.bar,那么retain属性声明中的指令将导致对象被保留,因此分配一个自动释放的值是合适的。但是由于您要分配给“裸”实例变量,因此您需要自己处理保留,因此您需要第一种形式。

PS:我有点惊讶分析仪没有抱怨第二个版本。

PPS:应该注意的是,这里的选择高度依赖于上下文。但是您包含了足够的上下文(属性定义)来做出选择。如果没有看到属性定义(或其他信息,在非属性的情况下),很难说。

于 2012-12-09T03:21:14.787 回答
2

版本不正确,autorelease并且在某些情况下可能会导致崩溃——您的第一行导致_bar保留计数为1,因此会一直存在,直到您不再需要它为止release-dealloc

然而,第二行会很快释放对象(特别是在运行循环结束时),因此可能会在您仍然需要它时使其消失。

阅读Apple 的内存管理指南了解更多信息。

于 2012-12-09T03:21:22.143 回答