iphone - main.m 真的是每个事件创建主运行循环的自动释放池的地方吗?

标签 iphone cocoa-touch uikit autorelease

#import <UIKit/UIKit.h>

int main(int argc, char *argv[]) {
    NSLog(@"new event...");
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

如果是这样的话,那么 main() 函数就必须在每个事件上调用,对吧?但我尝试了,“新事件...”日志消息在应用程序启动时出现。所以我猜测主线程中一定还有另一个自动释放池。

最佳答案

没有。所有 Cocoa 或 CocoaTouch 类都需要存在自动释放池,以免泄漏内存。因此,需要现有的自动释放池来调用 UIApplicationMain(),以覆盖在 UIApplicationMain() 上下文中实例化的任何(可能)自动释放对象。正如您所看到的,这个外部自动释放池在 UIApplicationMain 返回后、应用程序退出之前被耗尽。内部(请记住,自动释放池可以嵌套,并且自动释放对象会添加到最新/最深的池中)自动释放池在应用程序运行循环的每次迭代开始时创建,并在迭代结束时释放。因此,运行循环的每次迭代都是“自己的”自动释放池。如果处理事件可能会生成大量自动释放内存(在 iPhone 上这是一个坏主意,但在 OS X 上很常见),您可能需要在事件处理代码中创建自己的内部自动释放池,该池可以在处理该事件期间释放事件。

关于iphone - main.m 真的是每个事件创建主运行循环的自动释放池的地方吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/798950/

相关文章:

ios - 如何禁用 UITableView 中所有未选中的单元格

ios - 将 TextView 滚动到顶部

ios - 将 UDID 添加到由 xCode 管理的配置文件中?

iphone - uipagecontrol指示器(点)问题

iphone - UITextField SecureTextEntry 字段将键盘从数字键盘更改为通用键盘

html - iOS 从 HTML 安装应用程序

ios - 如何在 iOS 中建立多对多关系? (核心数据)

iPhone 应用程序横向模式不起作用

ios - 将 UINavigationBar 附加到 UIScrollView 以获得缩小的标题

ios - 带圆角的底部内部阴影