2011-08-10 66 views
0

我在我的connectionDidFinishLoading類中有漏洞,如何解決這個問題?iPhone SDK:在分配屬性值時發生內存泄漏?

enter image description here

@property (nonatomic,retain) NSMutableData *responseXMLData; 
@property (nonatomic,copy) NSMutableData *lastLoadedResponseXMLData; 

-(void)dealloc { 
[responseXMLData release] ; 
responseXMLData=nil; 
[lastLoadedResponseXMLData release]; 
lastLoadedResponseXMLData=nil; 
[super dealloc]; 
} 
+1

?它是'NSMutableData'嗎?你可以檢查你是否直接訪問'lastLoadedResponseXMLData'或'responseXMLData'(不使用屬性,我的意思是,除了你正在做的發佈)? – sergio

+1

很確定你需要改變你的lastLoadedResponseXMLData屬性來保留而不是複製,如果你打算在第一次設置之後改變它。 – mattacular

+0

@matt thx你建議解決我的問題,創建一個答案,我可以接受它 – Spring

回答

1
@property (nonatomic,copy) NSMutableData *lastLoadedResponseXMLData; 

既然你與你將要設置和改變一個可變對象的工作,你應該使用RETAIN:

@property (nonatomic,retain) NSMutableData *lastLoadedResponseXMLData; 

保留 - 「指定保留應的物體時被調用賦值......以前的值發送一個釋放消息。「所以你可以想象分配一個NSString實例(這是一個對象,你可能想保留)。

copy - 「指定應該使用該對象的副本進行賦值......以前的值將發送一個釋放消息。」基本上與保留相同,但發送 - 複製而不是 - 保留。

這裏是關於各種get/set方法可以指示@財產/ @合成爲你創造一些良好的閱讀:哪種類型是根據儀器泄漏對象http://cocoawithlove.com/2010/06/assign-retain-copy-pitfalls-in-obj-c.html

1

你不告訴我們你在哪裏創建responseXMLData對象?在任何你正在初始化該對象應該釋放

self.responseXMLData = [[NSMutuableData alloc]init]autorelease]; 

,並在你的dealloc方法,你可能只是說

-(void)dealloc { 

    self.responseXMLData = nil; //which is equivalent to [responseXMLData release]; responseXMLData=nil; 
} 

0

只是一個想法,在你的:

self.lastLoadedResponseXMLData = nil; 
self.lastLoadedResponseXMLData = self.responseXMLData; 

在dealloc發佈一個發佈之前,是否有可能在哪裏設置爲n il並將下一個responseXMLData複製到lastLoadedResponseXMLData而不釋放任何以前的副本?