MJFoundation.m 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. //
  2. // MJFoundation.m
  3. // MJExtensionExample
  4. //
  5. // Created by MJ Lee on 14/7/16.
  6. // Copyright (c) 2014年 小码哥. All rights reserved.
  7. //
  8. #import "MJFoundation.h"
  9. #import "MJExtensionConst.h"
  10. #import <CoreData/CoreData.h>
  11. #import "objc/runtime.h"
  12. @implementation MJFoundation
  13. + (BOOL)isClassFromFoundation:(Class)c
  14. {
  15. if (c == [NSObject class] || c == [NSManagedObject class]) return YES;
  16. static NSSet *foundationClasses;
  17. static dispatch_once_t onceToken;
  18. dispatch_once(&onceToken, ^{
  19. // 集合中没有NSObject,因为几乎所有的类都是继承自NSObject,具体是不是NSObject需要特殊判断
  20. foundationClasses = [NSSet setWithObjects:
  21. [NSURL class],
  22. [NSDate class],
  23. [NSValue class],
  24. [NSData class],
  25. [NSError class],
  26. [NSArray class],
  27. [NSDictionary class],
  28. [NSString class],
  29. [NSAttributedString class], nil];
  30. });
  31. __block BOOL result = NO;
  32. [foundationClasses enumerateObjectsUsingBlock:^(Class foundationClass, BOOL *stop) {
  33. if ([c isSubclassOfClass:foundationClass]) {
  34. result = YES;
  35. *stop = YES;
  36. }
  37. }];
  38. return result;
  39. }
  40. + (BOOL)isFromNSObjectProtocolProperty:(NSString *)propertyName
  41. {
  42. if (!propertyName) return NO;
  43. static NSSet<NSString *> *objectProtocolPropertyNames;
  44. static dispatch_once_t onceToken;
  45. dispatch_once(&onceToken, ^{
  46. unsigned int count = 0;
  47. objc_property_t *propertyList = protocol_copyPropertyList(@protocol(NSObject), &count);
  48. NSMutableSet *propertyNames = [NSMutableSet setWithCapacity:count];
  49. for (int i = 0; i < count; i++) {
  50. objc_property_t property = propertyList[i];
  51. NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
  52. if (propertyName) {
  53. [propertyNames addObject:propertyName];
  54. }
  55. }
  56. objectProtocolPropertyNames = [propertyNames copy];
  57. free(propertyList);
  58. });
  59. return [objectProtocolPropertyNames containsObject:propertyName];
  60. }
  61. @end