2011-06-06 38 views
0

在我的應用程序,我收到了內存泄漏爲什麼這些方法之一導致泄漏和其他不

第一

-(void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    result = [[NSString alloc] initWithBytes:[webData mutableBytes] 
             length:[webData length] 
            encoding:NSUTF8StringEncoding]; 
    [webData release]; 
} 

第二

-(void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    NSString * result = [[NSString alloc] initWithBytes:[webData mutableBytes] 
               length:[webData length] 
               encoding:NSUTF8StringEncoding]; 
    [webData release]; 
} 

在我的第一個過程,我沒有得到內存泄漏(全局聲明一個字符串對象,我沒有釋放它)

以我第二過程我得到在字符串對象內存泄漏。

  1. 價值其初始化過程中存儲到「結果」被從不讀

  2. 方法返回一個Objective-C對象與1保留計數(擁有參考)

  3. 對象上線分配124並且存儲到'結果'中後不再引用此點並且保留計數爲+1(對象泄露)

什麼是二fference?

回答

3

在第一種情況下,分析器期望您在該類的方法中釋放您初始化的result字符串,例如- (void)dealloc方法。如果你不這樣做 - 你會得到一個泄漏,以及(你會看到泄漏,如果你通過工具添加的應用與泄漏儀器上運行你的應用程序

在第二種情況下,你要創建一個局部變量。方法的範圍,它應該被釋放,因爲你不會有任何其他方法的參考(即如果你嘗試訪問result變量在其他方法中,你會得到未知的標識符錯誤)

1

區別是該全局字符串變量仍指向包含對象的存儲位置,而本地變量超出範圍,所以沒有指針不再和內存沒有被釋放。

這就是說,人們必須明白,即使是技術上的情況下不被泄露,可以被看作是這樣的,特別是如果不打算使用全局變量,只適用於應用程序的生命週期的參考。