线程中的iOS内存泄漏

时间:2014-03-24 15:26:47

标签: ios objective-c multithreading automatic-ref-counting nsthread

运行我的线程一段时间后,Instruments表明_​​_NSDate已经稳定地调整了它的#erage值。

我的结论是,这个步骤不会处理对象。但是,这一行会导致编译错误NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

如何强制此线程保留其所有对象,或者如何使用工作ARC创建正确的线程。

- (void) start {
   NSThread* myThread = [[NSThread alloc] initWithTarget:self
                                          selector:@selector(myThreadMainRoutine)
                                          object:nil];
   [myThread start];  // Actually create the thread
}

- (void)myThreadMainRoutine {

   // stuff inits here ...


   // Do thread work here.
   while (_live) {

      // do some stuff ...

      [runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.05]];        
      [NSThread sleepForTimeInterval:0.05f];
   }

   // clean stuff here ...

}

2 个答案:

答案 0 :(得分:5)

自动释放的对象可能是内存使用量增加的原因, 但你不能将NSAutoreleasePool用于ARC。取代

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// ...
[pool drain];

@autoreleasepool {
    // ...
}

更新:在您的情况下,您实际上需要两个自动释放池。首先, Threading Programming Guide州:

  

如果您的应用程序使用托管内存模型,请创建一个   自动释放池应该是你在线程入口中做的第一件事   常规。同样,破坏这个自动释放池应该是   你在线程中做的最后一件事。此池确保自动释放   对象被捕获,虽然它不会释放它们直到线程   本身退出。

最后一句话给出了为什么你需要另一个自动释放池的线索:否则 在长时间运行的循环中创建的所有自动释放的对象只会在释放时释放 线程退出。你有

- (void)myThreadMainRoutine {
    @autoreleasepool {
        // stuff inits here ...
        while (_live) {
            @autoreleasepool {
                // do some stuff ...
                [runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.05]];        
                [NSThread sleepForTimeInterval:0.05f];
            }
        }
        // clean stuff here ...
    }
}

答案 1 :(得分:0)

- (void)myThreadMainRoutine {
    @autoreleasepool {
       // stuff inits here ...

       // Do thread work here.
      while (_live) {
          // do some stuff ...
          [runLoop runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.05]];        
          [NSThread sleepForTimeInterval:0.05f];
      }

      // clean stuff here ...

   }
}