2013-03-21 26 views
9

Khi bạn in mô tả của một NSThread, bạn sẽ có được một cái gì đó như thế này:Số NSThread trên iOS?

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

Đây có phải là "num" có sẵn bằng cách nào đó?

Đây chỉ là để gỡ lỗi, do đó không cần phải xóa quy trình phê duyệt của Apple.

+0

Có thể nó nằm trong '- [ luồngDictionary] '? (Bạn có thể lưu trữ thông tin địa chỉ luồng trong 'NSThread''s _threadDictionary _...) – nielsbot

+0

Ý tưởng tuyệt vời, nhưng không có súc sắc: Nó trống. :) –

+0

Đó không phải là con trỏ của nó sao? Có thể không giống với ID luồng mà NSLog in. –

Trả lời

11

Con số này thực sự là một Ivar trong lớp thực hiện tin NSThread của. Lớp là _NSThreadInternal, và tên của nó là Bên trong đối tượng đó, ngà là seqNum.

Bạn có thể kéo nó trực tiếp nếu bạn sẵn sàng dựa vào các đường dẫn chính không có giấy tờ. cuộc gọi):

@implementation NSThread (GetSequenceNumber) 

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

@end 

Tôi đã thử nghiệm bằng cách đặt thủ công ngà voi đó bằng các cuộc gọi thời gian chạy và sau đó NSLogging chuỗi. Chắc chắn, mô tả phản ánh sự thay đổi. Điều này rõ ràng là không được ghi lại, vì vậy ...

... tự chịu rủi ro.

Đó là một bài tập thú vị, nhưng mọi thứ thường riêng tư vì một lý do. Mã được vận chuyển chắc chắn nên tránh những thứ như thế này trừ khi tất cả các tuyến đường khác đã cạn kiệt hoàn toàn.

+0

Tôi đang thử nghiệm điều này ngay bây giờ, nhưng có vẻ hoàn hảo. –

+1

Vâng, điều này là hoàn hảo. Lưu ý rằng điều này cần phải được thực hiện trong tập tin không sử dụng ARC. Nhưng vì bạn có thể kết hợp ARC và không, đó không phải là vấn đề. –

+0

Điểm tốt Stephen, tôi đánh lừa nó trong một dự án cũ đã xảy ra để được mở. Tôi cập nhật nó thành ARC thân thiện (và đẹp hơn nói chung). –

6

tôi đã đi trước và đã viết ra gợi ý @ XLC, chỉ vì:

@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 

này trả lời các câu hỏi về việc "num" từ thread - mặc dù các câu hỏi liên kết dưới dạng dupe có thể hữu ích cho câu hỏi chung về chủ đề xác định duy nhất.

(Câu trả lời Tôi thích có được "tạo ra một UUID và đưa vào trong từ điển chủ đề của chủ đề.)

+0

Tôi thích điều này tốt hơn trong trường hợp này, vì số luồng có thể đọc được nhiều hơn UUID và điều này khớp với trình gỡ rối. Cảm ơn. –

+0

nếu bạn đang làm điều này rất nhiều, bạn có thể sửa đổi mã này để lưu bộ nhớ cache bằng cách sử dụng 'objc_setAssociatedObject()'/'objc_getAssociatedObject()' – nielsbot

Các vấn đề liên quan