我需要理解为什么在这段代码中,如果我使用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);
谢谢!
答案 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];
......相反,我想过。