iOS上的NSThread编号?
打印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: 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