10

当你打印一个 NSThread 的描述时,你会得到这样的东西:

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

这个“num”是否以某种方式可用?

这仅用于调试,因此不需要清除 Apple 的审批流程。

4

2 回答 2

14

这个数字实际上是 NSThread 的私有实现类中的一个 ivar。类是_NSThreadInternal,它的名字是“_private”。在该对象内部,ivar 是seqNum.

如果您愿意依赖未记录的密钥路径,则可以直接提取它。这样就可以了(并且在使用 valueForKeyPath 而不是运行时调用时很好地调用 Neilsbot):

@implementation NSThread (GetSequenceNumber)

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

@end

我通过使用运行时调用手动设置该 ivar 然后 NSLogging 线程对其进行了测试。果然,描述反映了变化。这显然没有记录,所以......

...使用风险自负。

这是一个有趣的练习,但出于某种原因,事情通常是私密的。交付的代码当然应该避免这样的事情,除非所有其他路线都已彻底用尽。

于 2013-03-21T22:08:02.463 回答
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 并放入线程的线程字典中。)

于 2013-03-21T21:54:30.253 回答