为啥 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为啥不能控制:已经审批的采购申请,在不反审批的情况下,可以被删除?