2011-08-19 41 views
0

我遇到了與iphone中的內存管理相關的奇怪問題。由於iphone中的訪問器方法導致的內存管理問題

我解釋它通過一個例子 考慮以下書面一段代碼

在XMLParser.h

@interface XMLParser:NSObject/*<NSXMLParserDelegate>*/ { 
    NSMutableArray *parsedXML; 

} 
@property (nonatomic, retain) NSMutableArray *parsedXML; 

在XMLParser.m如果我寫我init函數像下面書面形式 #進口「XMLParser.h」

@implementation XMLParser 

@synthesize parsedXML; 

- (XMLParser *) initXMLParser :(NSString *)repetingTagStr{ 

self = [super init]; 
    if(self){ 
     self.parsedXML = [[NSMutableArray alloc] initWithCapacity:1]; 
     NSLog(@"%d", [self.parsedXML retainCount]); 
    [self.parsedXML release]; 

    } 

return self; 
} 

- (void) dealloc { 
[parsedXML release]; 
[super dealloc]; 
} 

@end 

NSLog將保留計數設置爲2,當發佈聲明後如果我嘗試使用它,則我噸發生崩潰。如果我使用它分配它 NSMutableArray * temp = [[[[NSMutableArray alloc] initWithCapacity:1] autorelease]; 或 self.parsedXML = [NSMutableArray arrayWithCapacity:1]; 然後它工作正常。

我現在真的非常困惑,因爲autorelease不會導致崩潰並立即釋放導致崩潰。 是否與訪問器方法有關。 請解釋在我的概念中的內存管理:)

回答

1

既然你已經宣佈你的財產爲(assign),遇事當你設置self.parsedXML = ...它不會被自動保留。嘗試使用(retain)屬性。

+0

謝謝..對不起,我錯誤地把它分配在那裏,實際上它的保留,我在這裏分享的結果是與保留財產。實際上我正在測試一些東西,並且在這裏分配了相同的代碼,現在可以請您解釋爲什麼在這裏發生這種情況與保留屬性 – vikas

+0

它不應該發生。有更多的代碼可以發佈嗎? – jtbandes

+0

實際上,這是唯一的代碼,並且這個函數「initXMLParser」是在創建類XMLParser的實例時調用的。你可以簡單地將上面的init代碼放在任何viewcontroller類的viewdidload中,並檢查它的結果。立即釋放是崩潰和autorelease工作正常與accessor方法.... :( – vikas

1

永遠不要依賴於retainCount的結果。 see here for more details

讓我們來調試您的示例。你創建一個NSMutableArray的實例,並且由於你的訪問器方法的定義,它被直接賦值給你的成員變量。保留計數仍保持爲1,因爲在創建時此計數器設置爲1,並且分配不會增加它。然後你釋放你的數組。保持計數下降到0,你的陣列被髮送到涅v。在發佈後訪問您的陣列會導致應用程序崩潰,這是您已經認識到的。

使用autorelease創建您的NSMutableArray(您顯示的兩個示例都這樣做),數組的保留計數器仍爲1,但不會立即發送釋放。它在事件循環的當前迭代之後發送。這就是爲什麼你可以在你的方法期間訪問數組。

我的建議:使用你的第一種方法,並在陣列創建後刪除你的版本。在dealloc-method中,你已經釋放你的數組,所以不會發生內存泄漏,一切都很好。

+0

謝謝TRD ...對不起,我錯誤地把分配在那裏,實際上它的保留,和我在這裏分享的結果與保留財產。正在測試一些東西,並且我在這裏放置了相同的代碼,你現在可以解釋一下爲什麼在這裏發生這種與保留屬性的情況 – vikas

1

首先,忽略retainCount - 我不能強調這一點!

您發佈的代碼(屬性設置爲retain)不會崩潰。它一定是別的東西導致你的錯誤:)

添加崩潰到您的問題的代碼行,我們可以提供更多幫助。