探查器在使用NSThread时报告泄漏.该项目是用ARC为Objective C和iOS编写的



这是我尝试管理线程的方式

-(void)ExecuteThread {
@autoreleasepool {
bInsideDifferentThread = YES;
//some code...
bInsideDifferentThread = NO;
}
[NSThread exit];
}
-(void)ThreadCallerEvent {
NSThread *myThread = [[NSThread alloc] initWithTarget:self     selector:@selector(ExecuteThread) object:nil];
if (!bInsideThread)
[myThread start];
else
{
[myThread cancel];
}
}

我这样做是因为我不希望线程在完成工作之前启动。问题是,这会从分配在[NSThread init]的未释放内存中产生泄漏

有什么解决这个问题的办法吗?

我运行了一个与您类似的片段,但无法检测到泄漏;但几乎可以肯定的是,情况有所不同。在您的示例中,当myThread超出范围时,我真的不确定ARC对它做了什么。使用NSThread的典型模式是:

[NSThread detachNewThreadSelector:@selector(executeThread)
toTarget:self
withObject:nil];

在这种情况下,您不负责直接处理正在分离的线程(注意:我更改了您的方法名称,使用camel-case,这是Cocoa中首选的方法和变量命名约定。)

以上所述,管理线程不再是实现并发设计的首选方式。这是完全可以接受的;但苹果正在鼓励开发者迁移到GCD。从需要同时执行的工作单元的角度来思考要好得多。

在这种情况下,如果不更深入地了解您的需求,很难知道直接使用线程可能会给您带来什么好处(如果有的话);但我会考虑更仔细地研究并发队列/GCD。也许你可以简单地使用这样的东西:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//  do your background work
});

并实现更清晰的并发性设计,避免您现在看到的任何内存管理问题。

最新更新