0

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

-(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]

关于如何解决这个问题的任何想法?

4

1 回答 1

0

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

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

在这种情况下,您不负责直接处理要分离的线程。 (注意:我将您的方法名称更改为使用驼峰式大小写,这是 Cocoa 中首选的方法和变量命名约定。)

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

在这种情况下,如果不更深入地了解您的需求,就很难知道直接使用线程可以为您提供哪些优势(如果有的话);但我会考虑更仔细地查看并发队列/GCD。也许你可以简单地使用类似的东西:

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

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

于 2012-11-23T01:54:29.487 回答