LookinObject.m 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. //
  2. // LookinObject.m
  3. // Lookin
  4. //
  5. // Created by Li Kai on 2019/4/20.
  6. // https://lookin.work
  7. //
  8. #import "LookinObject.h"
  9. #import "LookinIvarTrace.h"
  10. #import "NSArray+Lookin.h"
  11. #import "NSString+Lookin.h"
  12. #import "NSObject+LookinServer.h"
  13. @implementation LookinObject
  14. #if TARGET_OS_IPHONE
  15. + (instancetype)instanceWithObject:(NSObject *)object {
  16. LookinObject *lookinObj = [LookinObject new];
  17. lookinObj.oid = [object lks_registerOid];
  18. lookinObj.memoryAddress = [NSString stringWithFormat:@"%p", object];
  19. lookinObj.classChainList = [object lks_classChainListWithSwiftPrefix:YES];
  20. lookinObj.specialTrace = object.lks_specialTrace;
  21. lookinObj.ivarTraces = object.lks_ivarTraces;
  22. return lookinObj;
  23. }
  24. #endif
  25. #pragma mark - <NSCopying>
  26. - (id)copyWithZone:(NSZone *)zone {
  27. LookinObject *newObject = [[LookinObject allocWithZone:zone] init];
  28. newObject.oid = self.oid;
  29. newObject.memoryAddress = self.memoryAddress;
  30. newObject.classChainList = self.classChainList;
  31. newObject.specialTrace = self.specialTrace;
  32. newObject.ivarTraces = [self.ivarTraces lookin_map:^id(NSUInteger idx, LookinIvarTrace *value) {
  33. return value.copy;
  34. }];
  35. return newObject;
  36. }
  37. #pragma mark - <NSSecureCoding>
  38. - (void)encodeWithCoder:(NSCoder *)aCoder {
  39. [aCoder encodeObject:@(self.oid) forKey:@"oid"];
  40. [aCoder encodeObject:self.memoryAddress forKey:@"memoryAddress"];
  41. [aCoder encodeObject:self.classChainList forKey:@"classChainList"];
  42. [aCoder encodeObject:self.specialTrace forKey:@"specialTrace"];
  43. [aCoder encodeObject:self.ivarTraces forKey:@"ivarTraces"];
  44. }
  45. - (instancetype)initWithCoder:(NSCoder *)aDecoder {
  46. if (self = [super init]) {
  47. self.oid = [(NSNumber *)[aDecoder decodeObjectForKey:@"oid"] unsignedLongValue];
  48. self.memoryAddress = [aDecoder decodeObjectForKey:@"memoryAddress"];
  49. self.classChainList = [aDecoder decodeObjectForKey:@"classChainList"];
  50. self.specialTrace = [aDecoder decodeObjectForKey:@"specialTrace"];
  51. self.ivarTraces = [aDecoder decodeObjectForKey:@"ivarTraces"];
  52. }
  53. return self;
  54. }
  55. - (void)setClassChainList:(NSArray<NSString *> *)classChainList {
  56. _classChainList = classChainList;
  57. }
  58. + (BOOL)supportsSecureCoding {
  59. return YES;
  60. }
  61. - (NSString *)completedSelfClassName {
  62. return self.classChainList.firstObject;
  63. }
  64. - (NSString *)shortSelfClassName {
  65. return [[self completedSelfClassName] lookin_shortClassNameString];
  66. }
  67. @end