2014-02-17 45 views
1

我有一个页面发生autorefresh,并调用一个方法。我在那个方法中拷贝了CXMLELement,并使用它。我的项目在ARC之下。ARC:复制方法

(void)update:(CXMLElement)element 
{ 
CXMLElement *node = [element copy]; 
passToAnotherMethod(node); 
} 

(或)

(void)update:(CXMLElement)element 
{ 
self.xml = [element copy]; // xml is a strong propery in class which will be used in other methods 

} 

当我使用分配的工具,我看到被复制在所有未释放的元素。这可能是什么问题。我应该怎么做才能释放每次都复制的节点。请帮忙。

+1

你是怎么在这行代码后面使用'node'的? – mvb

+0

请你能包括这个方法的所有代码。向我们展示这条线并不是真的有帮助,它本身就是一行代码,并不重要。 – Popeye

+0

将节点传递给解析它的另一个方法。 – user694688

回答

0

当你复制元素意味着你正在为同一个对象创建一个新的指针,因此节点作为新的对象。如果当前执行完成,它将自动释放,如果现在对同一对象有新的引用(如果在一个方法中,您将节点实例发送给另一个对象,则另一个对象也指节点指针)

+0

但是,由于某种原因没有看到节点正在发布。所以,记忆力不断增加。 – user694688

+0

从其他地方引用节点吗? – Rajesh

+0

不,它不被其他地方引用 – user694688

0

有两件事你应该考虑调用update:(CXMLElement)element的地方,元素的实际所有者就是那个特定的类。尽管您在update:(CXMLElement)element中使用它,但引用计数增加1。你可以尝试以下方法

  1. 申报财产XML作为weak并宣布它实际上创造也宣布weak
  2. 不要使用任何回调从update:(CXMLElement)element其中通过元素作为返回类型元素的实际调用者(这应该使一个保留周期)

编辑: 请尝试

-(void)update:(CXMLElement *)element  
    { 
     passToAnotherMethod(element); 

    } 
+0

Thanks.The传递给更新方法的元素也不被所有者保留。它只是从服务器获取数据,转换成XML并将其发送到更新方法。由于这个方法在自动刷新期间每次都被调用,我认为它会产生泄漏。 – user694688

+0

你尝试在autorefresh之前手动设置element = nil的值吗? – LML

+0

我没有控制权,它是从更新方法被调用的框架。仍然没有得到为什么ARC不处理这个问题。 – user694688