2010-12-10 60 views
0

我需要理解为什么在这段代码中,如果我使用self.ws_data将值赋给ws_data变量,而不是如果我只使用ws_data,那么我会得到内存泄漏。为什么用“self”设置值会导致内存泄漏?

self.ws_data是一个@property(副本)NSString *,在dealloc上发布。

dispatch_queue_t ws_queue = dispatch_queue_create("ws check win", NULL); 
dispatch_async(ws_queue, ^{ 
    self.ws_data = [[NSString alloc]initWithContentsOfURL:url]; 
}); 
dispatch_release(ws_queue); 

谢谢!

回答

2

self.variableName通过访问器访问变量。由于您的ws_data NSString在其属性声明中设置为,因此将复制,该字符串在您通过该声明进行设置时保留。

不使用自我。引用伊娃而不通过那些访问者。这也意味着该变量不会被复制,所以当对它的引用消失时(例如在方法结束时)它就会消失。

赔率是你想要的副本。你只需要在你完成时释放它,就像你在dealloc中做的那样。

您是否将它保留在其他地方,使其成为第二次保留?

+0

不,我不保留它在任何地方。 – MatterGoal 2010-12-10 21:21:25

1

如果我正确地理解了事情(而且我很可能不这样做,因为我在这个实例中没有进行过iOS开发),因为你在属性上使用了copy属性,你当你使用self.ws_data时,你会这样做,它正在有效地调用已经被分配的NSString的复制方法,NSString会创建一个保留数为1的单独的NSString实例。

但是,最初的NSString(这是在你的上面的示例中被分配)不会在任何时候被释放,因此泄漏。

您可以使用...

self.ws_data = [[[NSString alloc]initWithContentsOfURL:url] autorelease]; 

...相反,我还以为。