2015-04-09 2 views
0

Почему количество остатков моей нитки = 2 ?? Он получает приращение после запуска метода почему?
Как сохранить счетчик работы для NSThreadsNSThread Retain Count

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    NSThread *thread; 

    @autoreleasepool 
    { 
     thread = [[NSThread alloc] initWithTarget:self selector:@selector(check) object:nil]; 
        NSLog(@"RC == %lu",(unsigned long)[thread retainCount]); 
     [thread start]; 
    } 

    NSLog(@"RC == %lu",(unsigned long)[thread retainCount]); 
}// presently stopped here on breakpoint 

-(void)check{ 
     for (int i = 0 ; i< 100000; i++) { 
      NSLog(@"NEW THREAD ==%d",i); 
     } 
} 

@end 

ответ

0

Это, как он работает, как вы обнаружили: start сохранит свой NSThread поэтому она переживет его исполнения. +[NSThread exit] будет декремент, который сохранит счет, как только вы закончите с ним.

С другой стороны, подумайте об этом: вы создаете NSThread и назначаете его (сохраненную) ссылку на локальную переменную. Как вы собираетесь его уменьшить? Локальная переменная не будет видна за пределами viewDidLoad, поэтому вы не сможете ее освободить.

Правильный способ обработки это с помощью Ивар для вашего вашего NSThread экземпляра, так что вы можете выпустить его в dealloc, или использовать autorelease д NSThread, рассчитывая на то, что start сохранит этот объект. Таким образом, вы можете:

 - (void)viewDidLoad { 
      [super viewDidLoad]; 

      NSThread *thread; 

      @autoreleasepool 
      { 
       thread = [[[NSThread alloc] initWithTarget:self selector:@selector(check) object:nil] autorelease]; 
        NSLog(@"RC == %lu",(unsigned long)[thread retainCount]); 
       [thread start]; 
      } 

и все будет по-настоящему.

Надеюсь, это объясняет, почему start сохраняет резьбу.

+0

не могли бы вы объяснить мне, если я использую 'NSLog (@ "RC ==% lu", (unsigned long) [thread keepCount]); 'после @autorlease {} он дает keepCount 3 на Xcode 6.1. – Sandy

+0

@Sandy: вы не можете полагаться на keepCount, чтобы предоставлять такую ​​информацию на низком уровне, которая имеет смысл для вас, это четко указано в документах Apple. Вы можете просто догадываться о том, что происходит внутри фреймворков Apple. – sergio