以下2行Objective C代码有什么区别?

时间:2012-12-09 03:16:22

标签: iphone objective-c ios xcode

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

很好。

我应该使用哪一个?

2 个答案:

答案 0 :(得分:4)

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

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

PS:我对分析师不抱怨第二个版本感到有些惊讶。

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

答案 1 :(得分:2)

autorelease版本不正确,可能会在某些情况下导致崩溃 - 您的第一行导致_bar保留计数为1,因此会一直保持release -dealloc当你不再需要它时,{}}} {}}}。

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

阅读Apple's Guide on Memory Management了解详情。

相关问题