Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS上的NSThread编号?_Ios_Debugging_Nsthread - Fatal编程技术网

iOS上的NSThread编号?

iOS上的NSThread编号?,ios,debugging,nsthread,Ios,Debugging,Nsthread,打印NSThread的描述时,会得到如下结果: <NSThread: 0x1e511b70>{name = (null), num = 1} {name=(null),num=1} 这个“num”是否可以使用 这只是为了调试,所以不需要清除苹果的审批流程。我继续写下@xlc的建议,只是因为: @implementation NSThread (ThreadGetIndex) -(NSInteger)getThreadNum { NSString * descriptio

打印NSThread的描述时,会得到如下结果:

<NSThread: 0x1e511b70>{name = (null), num = 1}
{name=(null),num=1}
这个“num”是否可以使用


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

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

该数字实际上是NSThread的私有实现类中的一个ivar。该类是
\NSThreadInternal
,其名称是“\u private”。在该对象内,ivar是
seqNum

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

我通过使用运行时调用手动设置ivar,然后记录线程来测试它。果然,描述反映了更改。这显然没有文档记录,所以

…使用风险自负。
这是一个有趣的练习,但事情通常都是私有的,这是有原因的。除非所有其他路由都已完全耗尽,否则附带的代码应该避免这样的事情。

可能在
-[threadDictionary]
?(您可以将线程本地信息存储在
NSThread
的threadDictionary中…)好主意,但没有骰子:它是空的。:)这不只是它的指针吗?可能与NSLog打印的线程ID不一样。不,NSLog打印的东西更漂亮。当然,我可以坚持使用指针,但我想找到数字。(例如,主线程是1。)好的,它只能从
[线程描述]访问
并从itI中提取编号,在本例中效果更好,因为线程编号比UUID更可读,并且与调试器匹配。谢谢。如果您经常这样做,可以使用
objc\u setAssociatedObject()
/
objc\u getAssociatedObject()修改此代码以缓存查找
我现在正在测试这个,但它看起来很完美。是的,这很完美。请注意,这需要在文件中完成,而不是使用ARC。但是,因为您可以混合和匹配ARC和non,这不是一个问题。很好的一点,Stephen,我在一个碰巧打开的旧项目中快速解决了这个问题。我将其更新为ARC友好型(并且总体上更好).现在我很高兴我问了,因为我不知道你能做到。谢谢!:)
valueForKeyPath:
在这里工作吗?
@implementation NSThread (GetSequenceNumber)

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

@end