可可中默认的 NSAutoreleasePool ?

发布于 2024-10-19 18:42:40 字数 954 浏览 1 评论 0原文

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

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

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

    [pool drain];
}

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

- (NSArray*) getTodayArray
{

    ...

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

    return res;
}

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

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

正确吗?如果是的话,何时以及如何分配?

I asked about NSAutoreleasePool, and understand that I need explicitly allocate autorelease pool in this case.

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

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

    [pool drain];
}

In my other question, I don't need release NSArray as it will be autoreleased.

- (NSArray*) getTodayArray
{

    ...

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

    return res;
}

In order to be the object autoreleased even though I didn't make any NSAutorelease, there should be some default autorelease pool allocated in Cocoa. The Xcode generated main function is pretty simple.

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

Is it correct? If so, when and how it's allocated?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

若水微香 2024-10-26 18:42:40

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

The main thread's NSRunLoop creates and destroys an NSAutoreleasePool every time it "loops". Note, however, that when you split off any background thread, you need to create an autorelease pool for it (since secondary threads, by default, do not have active run loops).

十年九夏 2024-10-26 18:42:40

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);

NSApplicationMain creates NSAutoreleasePool instance at first in NSApplicationMain. And as @Dave said, NSRunLoop creates and drains NSAutoreleasePool instance every loop.

As you know, it is not the exactly same between Apple's implementation and GNUstep implementation but these are similar.

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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文