【问题标题】:Why setting value with "self" cause memory leak?为什么用“self”设置值会导致内存泄漏?
【发布时间】:2011-05-23 16:53:16
【问题描述】:

我需要了解为什么在这段代码中,如果我使用 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);

谢谢!

【问题讨论】:

    标签: memory ios


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 不,我不会在任何地方保留它。
    【解决方案2】:

    如果在这种情况下我理解正确(我很可能不理解,因为我已经很久没有进行 iOS 开发了),因为你在属性上使用了 copy 属性,那么你会做什么当您使用 self.ws_data 时,您正在执行的操作实际上是在已分配的 NSString 上调用 copy 方法,该方法正在创建一个保留计数为 1 的 NSString 的单独实例。

    但是,原始的 NSString(在您的上述示例中分配)在任何时候都没有被释放,因此泄漏。

    你可以使用...

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

    ...相反,我会想到。

    【讨论】:

      猜你喜欢
      • 2013-07-12
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 1970-01-01
      相关资源
      最近更新 更多