2011-08-10 49 views
-2

可能重复:
iPhone SDK:How can I fix this leakage?iPhone SDK:如何解决这个漏洞?

来自这个问题和上一次不同,即使是在同一个班级,

我有如下的泄漏,

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

-(void)dealloc { 
[doc release]; 
doc=nil; 
[xmlBodyTemp release]; 
[responseXMLData release] ; 
responseXMLData=nil; 
[lastLoadedResponseXMLData release]; 
lastLoadedResponseXMLData=nil; 
[xmlBody release]; 
[super dealloc]; 
} 

enter image description here

第二个问题时,我写上面给出的变量:

self.responseXMLData = [self.lastLoadedResponseXMLData copy]; 

我需要释放self.lastLoadedResponseXMLData一次其他比我dellaoc做?或者只有delloc是足够的? autorelease似乎工作,但没有得到的想法为什么

+0

请不要重新发布相同的问题:[iPhone SDK:我该如何解决这个漏洞?](http://stackoverflow.com/questions/7015052/iphone-sdkhow-cani-i-fix-this-leakage) 。而是更新您的原始问题,评论答案,或者等待更好的答案。过了一段时间,如果你还没有一个满意的答案,你可以考虑给予奖励。 – PengOne

+0

@PengOne你不能看到主要泄漏问题,屏幕截图在这里完全不同吗?或者你只是在愚弄某个人而贬低某人? – Spring

+0

考虑到问题是完全相同的标题,代码非常相似,我并不感到惊讶的人是downvoting和投票结束重复。 –

回答

4

我强烈建议您通读苹果提供的Memory Management Programming Guide。这会让您更好地了解如何更好地管理您的分配。

-

IMO(不知道其他人会同意),所有你需要的dealloc做的是release你的对象。没有必要将它们设置为零。

您需要释放正在复制的对象。当你的东西,保留计数增加1.然后当你将它分配给self.responseXMLData时,保留计数再次增加1(因为属性保留)。在这里做的最好的事情是自动释放它。 [[self.lastLoadedResponseXMLData copy]autorelease];

[]拇指的简单规则是,任何时候你alloccopynew,或retain东西,你拥有它,而你负责在你把所有权范围释放它。

+0

是的,完全自动再生酶的作品,解决了一个骗局,但为什么我会这样做,如果dellaoc是足够的? – Spring

+0

以及主要问题呢? – Spring

+0

在这种情况下,由于您有一个过度保留的对象,dealloc不够用。通过在复制范围内不释放[self.lastLoadedResponseXMLData副本],最终的保留计数为2,并且在dealloc方法中将其释放时,您只需释放一次即可,我们仍然有一个参考。执行此操作的正确方法是自动释放副本,然后释放该属性在dealloc方法中保留的引用。 – csano