【问题标题】:NSThread number on iOS? [duplicate]iOS上的NSThread号? [复制]
【发布时间】:2013-03-11 14:31:44
【问题描述】:

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

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

这个“num”是否可用?

这只是为了调试,所以不需要清除苹果的审批流程。

【问题讨论】:

  • 也许是在-[&lt;thread&gt; threadDictionary]? (您可以将线程本地信息存储在NSThreadthreadDictionary...)
  • 好主意,但没有骰子:它是空的。 :)
  • 不就是它的指针吗?可能与 NSLog 打印的线程 ID 不同。
  • 不,NSLog 打印出更漂亮的东西。当然,我可以坚持使用指针,但我想找到数字。 (比如主线程是1。)
  • AFAIK,只能从[thread description]访问并从中提取号码

标签: ios debugging nsthread


【解决方案1】:

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

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

@implementation NSThread (GetSequenceNumber)

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

@end

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

...使用风险自负。

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

【讨论】:

  • 我现在正在测试它,但它看起来很完美。
  • 是的,这是完美的。请注意,这需要在不使用 ARC 的文件中完成。但既然您可以混合搭配 ARC 和非 ARC,这不是问题。
  • 好点斯蒂芬,我在一个碰巧打开的旧项目中把它搞定了。我将其更新为对 ARC 友好(并且总体上更好)。
  • 现在我很高兴我问了,因为我不知道你能做到这一点。谢谢! :)
  • valueForKeyPath: 在这里工作吗?
【解决方案2】:

我继续写了@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 并放入线程的线程字典中。)

【讨论】:

  • 我更喜欢这种情况,因为线程号比 UUID 更具可读性,并且与调试器匹配。谢谢。
  • 如果您经常这样做,您可以修改此代码以使用 objc_setAssociatedObject()/objc_getAssociatedObject() 缓存查找
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多