NSObject+LookinServer.m 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. //
  2. // NSObject+LookinServer.m
  3. // LookinServer
  4. //
  5. // Created by Li Kai on 2019/4/21.
  6. // https://lookin.work
  7. //
  8. #import "NSObject+Lookin.h"
  9. #import "NSObject+LookinServer.h"
  10. #import "LookinServerDefines.h"
  11. #import "LKS_ObjectRegistry.h"
  12. #import <objc/runtime.h>
  13. @implementation NSObject (LookinServer)
  14. #pragma mark - oid
  15. - (unsigned long)lks_registerOid {
  16. if (!self.lks_oid) {
  17. unsigned long oid = [[LKS_ObjectRegistry sharedInstance] addObject:self];
  18. self.lks_oid = oid;
  19. }
  20. return self.lks_oid;
  21. }
  22. - (void)setLks_oid:(unsigned long)lks_oid {
  23. [self lookin_bindObject:@(lks_oid) forKey:@"lks_oid"];
  24. }
  25. - (unsigned long)lks_oid {
  26. NSNumber *number = [self lookin_getBindObjectForKey:@"lks_oid"];
  27. return [number unsignedLongValue];
  28. }
  29. + (NSObject *)lks_objectWithOid:(unsigned long)oid {
  30. return [[LKS_ObjectRegistry sharedInstance] objectWithOid:oid];
  31. }
  32. #pragma mark - trace
  33. - (void)setLks_ivarTraces:(NSArray<LookinIvarTrace *> *)lks_ivarTraces {
  34. [self lookin_bindObject:lks_ivarTraces.copy forKey:@"lks_ivarTraces"];
  35. if (lks_ivarTraces) {
  36. [[NSObject lks_allObjectsWithTraces] addPointer:(void *)self];
  37. }
  38. }
  39. - (NSArray<LookinIvarTrace *> *)lks_ivarTraces {
  40. return [self lookin_getBindObjectForKey:@"lks_ivarTraces"];
  41. }
  42. - (void)setLks_specialTrace:(NSString *)lks_specialTrace {
  43. [self lookin_bindObject:lks_specialTrace forKey:@"lks_specialTrace"];
  44. if (lks_specialTrace) {
  45. [[NSObject lks_allObjectsWithTraces] addPointer:(void *)self];
  46. }
  47. }
  48. - (NSString *)lks_specialTrace {
  49. return [self lookin_getBindObjectForKey:@"lks_specialTrace"];
  50. }
  51. + (void)lks_clearAllObjectsTraces {
  52. [[[NSObject lks_allObjectsWithTraces] allObjects] enumerateObjectsUsingBlock:^(NSObject * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  53. obj.lks_ivarTraces = nil;
  54. obj.lks_specialTrace = nil;
  55. }];
  56. [NSObject lks_allObjectsWithTraces].count = 0;
  57. }
  58. + (NSPointerArray *)lks_allObjectsWithTraces {
  59. static dispatch_once_t onceToken;
  60. static NSPointerArray *lks_allObjectsWithTraces = nil;
  61. dispatch_once(&onceToken,^{
  62. lks_allObjectsWithTraces = [NSPointerArray weakObjectsPointerArray];
  63. });
  64. return lks_allObjectsWithTraces;
  65. }
  66. - (NSArray<NSString *> *)lks_classChainListWithSwiftPrefix:(BOOL)hasSwiftPrefix {
  67. NSMutableArray<NSString *> *classChainList = [NSMutableArray array];
  68. Class currentClass = self.class;
  69. while (currentClass) {
  70. NSString *rawClassName = NSStringFromClass(currentClass);
  71. NSString *currentClassName = hasSwiftPrefix ? rawClassName : [rawClassName lookin_shortClassNameString];
  72. if (currentClassName) {
  73. [classChainList addObject:currentClassName];
  74. }
  75. currentClass = [currentClass superclass];
  76. }
  77. return classChainList.copy;
  78. }
  79. - (NSString *)lks_shortClassName {
  80. NSString *rawName = NSStringFromClass([self class]);
  81. NSString *shortName = [rawName lookin_shortClassNameString];
  82. return shortName;
  83. }
  84. @end