【问题标题】:Class Method Instance Scope?类方法实例范围?
【发布时间】:2009-11-16 10:52:10
【问题描述】:

我的问题是关于在 +planet 中创建的对象的范围。我被告知“自动释放的对象将在它们创建的方法/函数的持续时间内一直存在” 在我的示例中,我假设行星实例的范围在 main() 和不在我执行初始 alloc/init 的方法内?

+(Planet *) planet {
    gPlanetCount++;
    return [[[self alloc] init] autorelease];
}

int main(int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Planet *outerMost;

    outerMost = [Planet planet];
    ...
    ... some code
    ...
    [pool drain];
    return 0;
}

EDIT_001

int main(int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Planet *outerMost;

    outerMost = [[Planet planet] retain]; // Added retain
    ...
    ... some code
    ...
    [outerMost release]; // Added release
    [pool drain];
    return 0;
}

加里

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    在周围的 NSAutoreleasePool 被耗尽之前,自动释放的对象总是有效的。在您的示例中,这涵盖了 main 方法。

    通常自动释放的对象在运行循环结束时被释放。因此,如果您调用返回自动释放对象的方法,它在您的函数体中仍然有效,直到您手动排出周围的 NSAutoreleasePool 或从运行循环调用的方法返回。

    【讨论】:

      【解决方案2】:

      自动释放的对象将一直保留到当前运行循环结束(此时 AutoRelease 池将被耗尽)或直到 AutoRelease 池被手动耗尽。

      这与它们的创建位置无关 - 只是在创建它们时哪个池处于活动状态以及该池何时耗尽。

      编辑:

      如果不将它们放在上下文中,就很难理解自动释放池的用途。在过程应用程序而不是事件驱动应用程序中使用自动释放池并不总是有意义的。如果您有一个应用程序处于无限循环中,那么您会不时地排空池。以下是它可能更有意义的方式:

      begin application
      
      begin endless loop
          create autorelease pool
      
          // process messages from the event queue (mouseclicks, keypresses etc) and
          // do stuff here - this might create autoreleased object
      
          drain autorelease pool
      end of endless loop
      
      end application
      

      每次迭代都会耗尽自动释放池。需要注意的是,如果在单个循环迭代中有大量处理,池可能会变得非常满。在这种情况下,您可以手动排空池。

      【讨论】:

        【解决方案3】:

        关于“自动释放的对象将在创建它们的方法/函数的持续时间内保留”的注释过于简单化,它假设您正在以“可可方式”做事。将“真实代码”放入 main() 不是 Cocoa 的方式,因此您遇到了更字面的答案,其他人已经完美地给了您。当你的自动释放池被刷新时,事情就消失了。

        该注释的实际意思是,当您在函数中创建对象时,您可以确保对象可以在至少周围停留直到函数结束,如只要您不自己刷新自动释放池。这意味着如果您只在该函数中使用对象,则无需在该函数中保留和释放它。如果您手动刷新自动释放池,您应该知道事情何时消失的实际规则(同样,frenetisch applaudierend 在这里是正确的)并且基本上忽略了简化。

        【讨论】:

          猜你喜欢
          • 2015-11-15
          • 2014-11-10
          • 2020-06-14
          • 2014-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-23
          相关资源
          最近更新 更多