在启用ARC的项目中使用自动释放池技术

3

可能是重复内容:
ARC 内存泄漏

在启用 ARC 的项目中,我们可以使用 @autoreleasepool 吗?如果可以,那么使用 @autoreleasepool 有什么用途呢?在谷歌上我发现,即使项目启用了 ARC,它也只会处理主线程。如果我们创建其他线程,则必须注意释放对象。
有人能解释一下吗?


你想从ARC中删除特定文件吗? - Nimit Parekh
谢谢您的及时回复。我认为您没有理解我的问题。为什么ARC不会释放在其他线程中创建的对象。 - Coder
ARC仅适用于Objective-C。一个应用程序也可以包含除Objective-C之外的对象。这就是为什么您发现ARC不能与其他线程一起工作。这只是您的错觉。实际上,ARC会处理包含Objective-C对象的所有线程。 - Niru Mukund Shah
2
@ForamMukundShah 如果你这么认为,我只能建议你做一件事:在写下完全错误的东西之前,请务必阅读 ARC 的文档。 - user529758
@H2CO3 我遇到了这样的问题。我已经阅读了文档。这就是我写这个的原因。顺便说一下,名称本身就表明它可能是 Objective-C - 自动引用计数器 或者 Objective-C++ - 自动引用计数器 - Niru Mukund Shah
2个回答

3

是的,ARC默认只在主线程上设置。然而,您也可以在后台线程中利用它。解决方案很简单:对于ARC,@autoreleasepool { }的语义与经典的MRC方式不同;它实际上并不分配和释放NSAutoreleasePool对象,而是告诉ARC同样负责调用它的线程中的对象,从而实现autorelease池样式的效果。


ARC只在主线程上设置?你能详细解释一下吗?哪部分代码属于主线程? - Coder
@jithen 指的是直接从 main() 和其祖先执行的代码,而不创建新线程的代码 - 即所有 UI 代码。更准确地说,所有未使用 pthread_create()NSThread 和带有除主队列以外的队列的 dispatch_async() 调用的代码。 - user529758
我刚刚创建了一个启用ARC的项目并启动了一个线程。在新线程中,我分配了一个对象但没有释放它。因此,如果我在Xcode中进行分析,根据您的说法,它应该会抛出潜在泄漏。但情况并非如此,它没有抛出任何潜在泄漏。 - Coder
代码片段:我将这段代码放在ViewDidload方法中 pThread = [[NSThread alloc]initWithTarget:self selector:@selector(myMain) object:nil];[pThread start];现在我在myMain函数中为一个字符串分配了内存。如果线程的这部分没有被ARC覆盖,那么它必须会抛出潜在的泄漏,但实际上它并没有抛出。 - Coder
@jithen 内存泄漏不会抛出异常,它们只是存在那里。 - user529758

0

当你从手动内存管理迁移到ARC时,你将替换以下内容:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pool release];

使用

@autoreleasepool {

    }

阅读NSAutoreleasePool文档和高级内存管理编程指南以更好地理解。

这个回答如何解决问题? - user529758

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接