objective-c:这会造成内存泄漏

时间:2012-05-28 01:06:40

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

如果我的代码看起来像这样:

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

        [something doSomething:blah andDelegate: A]; 

    }

假设doSomething的调用将进行http请求调用,因此仅当从服务器收到响应时才会调用委托。在这种情况下,会有延迟。 注意:某些东西是类的实例变量。

如果我两次调用'func',那么在收到对代表的回复之前,A的初始化是否会被泄露。假设在收到响应时调用委托函数时有释放操作。

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

2 个答案:

答案 0 :(得分:4)

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

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

  

第二次初始化'A'会取代第一次初始化'A'吗?

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

答案 1 :(得分:1)

somethingfunc应该发布Asomething在使用时也应保留A