2010-05-04 68 views
3

在我阅读的几乎所有书籍以及我经历的例子中,我都会看到用这种方式初始化的指针。假设我想要初始化一个类变量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上的“内存管理指南”,除非我错过了一些东西,否则我没有看到其中的差异。

回答

5

如果self.myString是一个保留的性质,第二实施例具有为

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

,或者它会泄漏。我只能假设情况是这样,第一个例子只是想避免使用autorelease

+0

因此,如果没有autorelease,最后的保留数是2? – Rob 2010-05-04 13:11:07

+0

是,'+ 1'为alloc,'+ 1'为保留属性。 – 2010-05-04 13:21:02

+0

完美!现在完成感觉感谢... – Rob 2010-05-04 13:30:52

4

第二个例子是正确的。

假设myString是一个实例变量,第一示例是实际错误的,因为它离开myString与悬空指针(指针的解除分配的对象)。如果它是self.myString这将是一个不同的故事。

+0

Doh ...你是对的,让我修改原文。那么两者之间真的没有区别? – Rob 2010-05-04 13:01:45

+0

@Rob:现在第二个代码有内存泄漏。 – kennytm 2010-05-04 13:10:13