2013-03-21 4 views
9

При печати описания не NSThread, вы получите что-то вроде этого:NSThread номер на iOS?

<NSThread: 0x1e511b70>{name = (null), num = 1} 

Является ли это «номер» доступна как-то?

Это только для отладки, поэтому ему не нужно очищать процесс утверждения Apple.

+0

Возможно, он находится в '- [ нитьDictionary]'? (Вы можете хранить нить-локальную информацию в 'NSThread' _threadDictionary _...) – nielsbot

+0

Отличная идея, но нет кубиков: она пуста. :) –

+0

Разве это не его указатель? Может не совпадать с идентификатором потока, который печатает NSLog. –

ответ

11

Это число фактически Ивар в частном классе реализации NSThread в. Класс _NSThreadInternal, и его имя «_private». Внутри этого объекта ivar равен seqNum.

Вы можете вытащить его напрямую, если вы готовы полагаться на недокументированные пути ключей. Это сделает это (и хороший вызов neilsbot при использовании valueForKeyPath вместо времени выполнения звонки):

@implementation NSThread (GetSequenceNumber) 

- (NSInteger)sequenceNumber 
{ 
    return [[self valueForKeyPath:@"private.seqNum"] integerValue]; 
} 

@end 

Я протестировал его, установив вручную ivar с помощью вызовов во время выполнения, а затем NSLogging потока. Разумеется, описание отражало изменение. Это, очевидно, не задокументировано, поэтому ...

... использовать на свой страх и риск.

Это забавное упражнение, но, как правило, частные дела по какой-то причине. Исправленный код, безусловно, должен избегать подобных вещей, если все другие маршруты полностью не исчерпаны.

+0

. Я тестирую это сейчас, но он выглядит идеально. –

+1

Да, это прекрасно. Обратите внимание, что это нужно сделать в файле, не использующем ARC. Но поскольку вы можете смешивать и сопоставлять ARC и non, это не проблема. –

+0

Хорошая точка Стивен, я выбил это в старом проекте, который оказался открытым. Я обновил его, чтобы он был дружелюбным к ARC (и вообще приятнее вообще). –

6

Я пошел вперед и написал предложение @ XLC, всего потому, что:

@implementation NSThread (ThreadGetIndex) 

-(NSInteger)getThreadNum 
{ 
    NSString * description = [ self description ] ; 
    NSArray * keyValuePairs = [ description componentsSeparatedByString:@"," ] ; 
    for(NSString * keyValuePair in keyValuePairs) 
    { 
     NSArray * components = [ keyValuePair componentsSeparatedByString:@"=" ] ; 
     NSString * key = components[0] ; 
     key = [ key stringByTrimmingCharactersInSet:[ NSCharacterSet whitespaceCharacterSet ] ] ; 
     if ([ key isEqualToString:@"num" ]) 
     { 
      return [ components[1] integerValue ] ; 
     } 
    } 
    @throw @"couldn't get thread num"; 
    return -1 ; 
} 

@end 

Это отвечает на вопрос о получении «Num» из потока - хотя этот вопрос связан как простофиля может быть полезным для общий вопрос об однозначной идентификации потоков.

(Ответ мне нравится там «генерировать UUID и поместить в словарь нить нити.)

+0

Мне нравится это лучше в этом случае, поскольку номер потока более читабельен, чем UUID, и это соответствует отладчику. Благодарю. –

+0

, если вы делаете это много, вы можете изменить этот код, чтобы кэшировать поиск, используя 'objc_setAssociatedObject()'/'objc_getAssociatedObject()' – nielsbot

Смежные вопросы