2010-05-04 64 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