为什么用“self”设置值会导致内存泄漏?

时间:2010-12-10 19:59:44

标签: memory ios

我需要理解为什么在这段代码中,如果我使用self.ws_data为ws_data变量赋值,而不是如果我只使用ws_data,则会出现内存泄漏。

self.ws_data是一个@property(copy)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 个答案:

答案 0 :(得分:2)

self.variableName 通过其访问者访问变量。因为您的ws_data NSString在其属性声明中设置为 copy ,所以当您通过该声明设置它时,将保留该字符串。

不使用 self。引用ivar而不通过这些访问者。它也意味着变量没有被复制,所以当它的引用消失时它会消失(就像在方法结束时一样)。

你想要副本的可能性很大。您只需要在完成后释放它,就像在dealloc中一样。

您是否将其保留在其他位置,将此访问权限保留为第二次保留?

答案 1 :(得分:1)

如果我在这个实例中正确理解了事情(并且我很可能没有,因为我根本没有进行iOS开发很长时间),因为你正在使用属性上的copy属性,你是什么'当你使用self.ws_data时,有效地在已经分配的NSString上调用copy方法,该NSString创建一个单独的NSString实例,其保留计数为1。

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

你可以使用......

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

......相反,我想过。