他们为什么用这种方式初始化指针?

时间:2010-05-04 12:55:09

标签: objective-c iphone memory-leaks memory-management

在我阅读的几乎所有书籍和我经历过的例子中,我看到指针以这种方式初始化。假设我有一个我要初始化的类变量 NSString * myString 。我几乎总会看到这样做:

-(id)init {
    if (self = [super init]) {
        NSString *tempString = [[NSString alloc] init];
        self.myString = tempString;
        [tempString release];
    }
    return self;
}

为什么我不能只做以下事情?

-(id)init {
    if (self = [super init]) {
        self.myString = [[NSString alloc] init];
    }
    return self;
}

我不明白为什么首先需要额外的 tempString ,但我可能会在这里遗漏内存管理。我想要做的事情是可接受的还是会引起某种泄漏?我在developer.apple.com上阅读了“内存管理指南”,除非我遗漏了一些内容,否则我看不出其中的差别。

2 个答案:

答案 0 :(得分:5)

如果self.myString是保留属性,则第二个示例必须是

-(id)init { 
    if (self = [super init]) { 
        self.myString = [[[NSString alloc] init] autorelease]; 
    } 
    return self; 
} 

否则会泄漏。我只能假设是这种情况,第一个例子只是想避免使用autorelease

答案 1 :(得分:4)

第二个例子是正确的。

假设myString是一个ivar,第一个例子实际上是错误的,因为它为myString留下了一个悬空指针(一个指向解除分配对象的指针)。如果它是self.myString那将是一个不同的故事。