为啥 NSThread 可以在不创建我自己的 autoreleasepool 的情况下清除自动释放的对象

Posted

技术标签:

【中文标题】为啥 NSThread 可以在不创建我自己的 autoreleasepool 的情况下清除自动释放的对象【英文标题】:why NSThread can clear autoreleased objects without creating my own autoreleasepoool为什么 NSThread 可以在不创建我自己的 autoreleasepool 的情况下清除自动释放的对象 【发布时间】:2014-07-29 07:48:16 【问题描述】:

所有。 我有如下测试代码:

- (void)viewDidLoad

    [super viewDidLoad];
    [NSThread detachNewThreadSelector:@selector(test) toTarget:self withObject:nil];


-(void)test

    MyClass *obj = [[[MyClass alloc] init] autorelease];
    NSLog(@"%@",[my description]);

我在 NSThread 的方法中创建了一个自动释放对象,但没有用户创建的自动释放池。 当 NSThread 退出时,obj 刚刚释放(我有一个断点 int 方法 delloc)。 为什么? NSThread 自己创建自己的 autoreleasepool 吗?

【问题讨论】:

是的,这已经在很久以前完成了。您曾经收到没有自动释放池的警告。 从什么时候开始,有什么文件可以说明这一点吗? 自ARC我相信..或附近的某个地方。我不知道任何文档,这只是一个通知。自 ARC 以来,目标 C 中的内存管理概念本身似乎已被弃用,因此所有这些东西都被删除了。 @MaticOblak:但是 OP 显然没有使用 ARC。 @user102008 即使不使用 ARC。我只是想解释一下这是什么时候发生的。过去你会收到警告说对象正在泄漏,因为不存在自动释放池。我不确定,但很可能现在发生的情况是当您调用自动释放时为您创建了池。那么它在什么时候被耗尽是另一个谜。无论如何,它与 ARC 无关,但似乎同时包含在内。 【参考方案1】:

我认为是这样的。 通常你需要创建一个自动释放轮询,因为你可能需要你的线程一直在运行,如果你不创建一个自动释放轮询,内存使用会一直增加。

但是在你的代码中,你只是在另一个线程中运行一个方法,运行它之后,线程退出。所以线程中使用的内存都被释放了。

【讨论】:

以上是关于为啥 NSThread 可以在不创建我自己的 autoreleasepool 的情况下清除自动释放的对象的主要内容,如果未能解决你的问题,请参考以下文章

请问SAP为啥不能控制:已经审批的采购申请,在不反审批的情况下,可以被删除?

为啥c ++ std::hash会创建一个仿函数结构并且可以在不每次创建结构的情况下调用它

多线程NSThread

带有异步回调的 NSThread 与 GCD

au为啥加载音频错误

为啥我不能在 ATMEGA64A-AU 串口中输入命令?