【问题标题】:Default NSAutoreleasePool in cocoa?可可中的默认 NSAutoreleasePool?
【发布时间】:2011-02-28 05:14:22
【问题描述】:

我询问了NSAutoreleasePool,并了解在这种情况下我需要显式分配自动释放池。

int main()
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // Create an array
    NSArray *month = [NSArray arrayWithObjects:@ ... nill];

    [pool drain];
}

在我的另一个question 中,我不需要释放NSArray,因为它会自动释放。

- (NSArray*) getTodayArray
{

    ...

    NSArray *res = [NSArray arrayWithObjects: year, month, nil];

    return res;
}

为了成为自动释放的对象,即使我没有进行任何 NSAutorelease,也应该在 Cocoa 中分配一些 default 自动释放池。 Xcode 生成的 main 函数非常简单。

int main(int argc, char *argv[])
{
    return NSApplicationMain(argc,  (const char **) argv);
}

正确吗?如果是这样,何时以及如何分配?

【问题讨论】:

    标签: objective-c cocoa autorelease


    【解决方案1】:

    主线程的NSRunLoop 每次“循环”时都会创建和销毁NSAutoreleasePool。但是请注意,当您拆分任何后台线程时,您需要为其创建一个自动释放池(因为默认情况下,辅助线程没有活动的运行循环)。

    【讨论】:

      【解决方案2】:

      NSApplicationMain 首先在 NSApplicationMain 中创建 NSAutoreleasePool 实例。正如@Dave 所说,NSRunLoop 在每个循环中都会创建和排出 NSAutoreleasePool 实例。

      如您所知,Apple 的实现和 GNUstep 的实现并不完全相同,但它们是相似的。

      GNUstep libs/gui/trunk/Source/Functions.m

      int
      NSApplicationMain(int argc, const char **argv)
      {
        NSDictionary      *infoDict;
        NSString              *mainModelFile;
        NSString      *className;
        Class         appClass;
        CREATE_AUTORELEASE_POOL(pool);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-31
        • 2011-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多