NSThread の説明を出力すると、次のようになります。
<NSThread: 0x1e511b70>{name = (null), num = 1}
この「num」は何とか利用できますか?
これはデバッグ専用なので、Apple の承認プロセスをクリアする必要はありません。
その番号は、実際には NSThread のプライベート実装クラスの ivar です。クラスは_NSThreadInternal
で、その名前は「_private」です。そのオブジェクト内で、ivar はseqNum
.
文書化されていないキー パスに依存する場合は、直接プルできます。これで解決します (ランタイム呼び出しの代わりに valueForKeyPath を使用して neilsbot を呼び出します):
@implementation NSThread (GetSequenceNumber)
- (NSInteger)sequenceNumber
{
return [[self valueForKeyPath:@"private.seqNum"] integerValue];
}
@end
ランタイム呼び出しで ivar を手動で設定し、スレッドを NSLogging してテストしました。案の定、説明には変更が反映されていました。これは明らかに文書化されていないので...
楽しいエクササイズですが、物事は通常、理由があって私的なものです。出荷されたコードは、他のすべてのルートが完全に使い果たされていない限り、このようなことを確実に回避する必要があります。
私は先に進み、@ 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 を生成し、スレッドのスレッド辞書に入れることです。)