【问题标题】:iPhone SDK:How can I fix this leakage?iPhone SDK:如何修复此泄漏?
【发布时间】:2011-08-10 17:21:23
【问题描述】:

我这里有泄漏,但找不到问题;

@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];
}

【问题讨论】:

    标签: iphone ios ios4


    【解决方案1】:

    没有看到您的dealloc 方法,我们无法确定您正确地释放了这些属性的值。

    但在发布的代码中,我确实看到了一个主要问题。但这不是你想的那样。

    self.lastLoadedResponseXMLData = docTempData;
    

    这一行虽然被 XCode 标记,但很好(假设您在 dealloc 中正确释放了值)。

    self.responseXMLData = [self.lastLoadedResponseXMLData copy];
    

    然而,这条线并不好。它会复制self.lastLoadedResponseXMLData 中的任何值,但您永远不会因为复制而释放引用。 self.responseXMLData,因为它被声明为“保留”,所以添加了它自己对对象的引用,并且(假设您在 dealloc 中正确释放了值)这个引用被清理了。

    如果你真的不需要关心对象是相同的还是副本,那就放弃副本吧。否则,自动释放它:

    self.responseXMLData = [[self.lastLoadedResponseXMLData copy] autorelease];
    

    【讨论】:

    • 我更新了代码,如果 lastLoadedResponseXMLData 没有在属性中声明为“副本”。你的建议还是一样?
    • 你能不能也看看tnx stackoverflow.com/questions/7007767/…
    • @XDeveloper:如果将 lastLoadedResponseXMLData 声明为“保留”而不是“复制”,则情况保持不变。如果它被声明为“分配”,事情就会改变。
    猜你喜欢
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2011-05-14
    • 1970-01-01
    相关资源
    最近更新 更多