代码之家  ›  专栏  ›  技术社区  ›  Dan Rosenstark

调用方法的方法:自动释放的基础知识?

  •  0
  • Dan Rosenstark  · 技术社区  · 14 年前

    当我认为我已经完全理解了这个主题时,我又回到了基础。

    我有一个实例化自动释放对象的方法,使用(例如) stringWithFormat :

    return [NSString stringWithFormat:@"what"];
    

    然后我从另一个方法和另一个方法调用这个方法,每次返回这个自动释放的 NSString 在层次结构的每一层。代码工作正常 非字符串 实例在层次结构的每个级别都是完整的。

    思想 由于实例是自动释放的,它可能会突然以 retainCount 在调用堆栈中的任何点上为0(即,其中一个方法将处理一个已释放的对象)。 我不能依赖这个物体是真的吗?

    编辑: 我知道这个问题不太清楚。对不起的。我的意思是:

    Method1 ---calls--->    Method2 ---calls---> Method3 ---instantiates the string---> 
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Barry Wark    14 年前

    可以安全地假定自动释放的对象不会在分配它的帧下面的堆栈帧中被释放。所以,在调用堆栈中

    method1
      method2 <== instance allocated/autoreleased here
       method3 <== safe to use here
    

    假设method2中的alloc/autoreleated实例在method3中是有效的,这是安全的,除非您玩了一些不好的技巧,并从method3中排出method1中创建的池。这是因为较高帧中的自动释放池无法在较低帧中排出(除非是由于愚蠢)。当然,一旦控制返回到方法1,所有下注都将关闭。

    较低框架中分配的自动释放池将不包含方法2中自动释放的实例,因为它们可能不是活动池(尚未创建!)在自动租赁时。

    最后, 除非 调用链中较低的方法, 之间 感兴趣的方法和实例化对象实例并自动释放对象实例的方法创建并释放自动释放池,可以确保在运行循环结束之前不会释放封闭池。

        2
  •  4
  •   GorillaPatch    14 年前

    答案是,在所有方法调用之后,nsAutoReleasePool都会被清空,而您又回到了运行循环中。这意味着在调用堆栈中,只要不返回运行循环,就不会释放对象。