【问题标题】:objective-c : will this create a memory leakObjective-c : 这会造成内存泄漏吗
【发布时间】:2012-05-28 01:06:40
【问题描述】:

如果我有这样的代码:

     -(void) func {  
         ObjectA* A = [[ObjectA alloc]init];  

        [something doSomething:blah andDelegate: A]; 

    }

假设 doSomething 的调用将发出一个 http 请求调用,因此只有在收到来自服务器的响应时才会调用委托。在这种情况下,会有延迟。 注意:something 是类的实例变量。

如果我调用 'func' 两次,A 的第一个初始化是否会在它收到委托的响应之前被泄露。假设收到响应时调用委托函数时有释放操作。

我想到这个的原因是,如果在第一个委托完成它的角色之前,第二个初始化的“A”作为委托传递给某个东西。 'A' 的第二个初始化会取代 'A' 的第一个初始化吗?

【问题讨论】:

    标签: objective-c memory-management memory-leaks delegates


    【解决方案1】:

    是的,如果您不使用 ARC 进行编译,则存在泄漏。您正在使用alloc 创建一个对象,这意味着您拥有它,并且您不会通过发送release 放弃该所有权。这是core memory management rule for Cocoa

    可能是您传递给A 的对象something 也需要拥有A(实际上,听起来就是这样)。如果是这样,something 应该将retain 发送到A,然后在不再需要A 时发送release

    第二个初始化的“A”会取代第一个初始化的“A”吗?

    有点。名称A 仅在此方法内有效。当您创建一个对象并将其分配给A,然后该名称超出范围时,您将无法再引用该对象。这就是泄漏。当您再次运行此方法时,实际上会创建一个新名称 A,然后您将另一个对象分配给它。

    【讨论】:

      【解决方案2】:

      somethingfunc 应该释放 Asomething 在使用时也应该保留A

      【讨论】:

      • 如果他使用 ARC,则不会。如果他使用 ARC,那将不会导致内存泄漏。
      猜你喜欢
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 1970-01-01
      • 2013-03-07
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多