|
24 | 24 | // |
25 | 25 |
|
26 | 26 | #import <objc/runtime.h> |
27 | | -#import <Foundation/Foundation.h> |
28 | 27 | #import "ReactBridgeUtils.h" |
29 | 28 |
|
| 29 | +#define let __auto_type const |
| 30 | +#define var __auto_type |
| 31 | + |
30 | 32 |
|
31 | 33 | // From RCTBridgeModule.h |
32 | 34 | typedef struct RCTMethodInfo { |
|
36 | 38 | } RCTMethodInfo; |
37 | 39 |
|
38 | 40 | static void class_performClassSelector(Class class, SEL selector) { |
39 | | - unsigned int numMethods = 0; |
40 | | - Method *methods = class_copyMethodList(object_getClass(class), &numMethods); |
41 | | - for (int i = 0; i < numMethods; i++) { |
42 | | - Method method = methods[i]; |
43 | | - if (sel_isEqual(method_getName(method), selector)) { |
44 | | - IMP imp = method_getImplementation(method); |
| 41 | + unsigned int count = 0; |
| 42 | + let methods = class_copyMethodList(object_getClass(class), &count); |
| 43 | + |
| 44 | + for (var i = 0; i < count; i++) { |
| 45 | + let method = methods[i]; |
| 46 | + let methodName = method_getName(method); |
| 47 | + if (sel_isEqual(methodName, selector)) { |
| 48 | + let imp = method_getImplementation(method); |
45 | 49 | ((void (*)(Class, SEL))imp)(class, selector); |
46 | 50 | break; |
47 | 51 | } |
48 | 52 | } |
| 53 | + |
49 | 54 | free(methods); |
50 | 55 | } |
51 | 56 |
|
52 | 57 | __attribute__((constructor)) |
53 | 58 | static void load() { |
54 | | - SEL selector = @selector(_registerModule); |
55 | | - int numClasses = objc_getClassList(NULL, 0); |
56 | | - Class* classes = (Class *)malloc(sizeof(Class) * numClasses); |
57 | | - numClasses = objc_getClassList(classes, numClasses); |
58 | | - for (int i = 0; i < numClasses; i++) { |
59 | | - Class class = classes[i]; |
60 | | - class_performClassSelector(class, selector); |
61 | | - } |
| 59 | + let selector = @selector(_registerModule); |
| 60 | + |
| 61 | + let processName = [NSProcessInfo.processInfo.processName cStringUsingEncoding: NSUTF8StringEncoding]; |
| 62 | + let processNameLength = strlen(processName); |
| 63 | + |
| 64 | + var count = objc_getClassList(NULL, 0); |
| 65 | + let classes = (Class *)malloc(sizeof(Class) * count); |
| 66 | + count = objc_getClassList(classes, count); |
| 67 | + |
| 68 | + dispatch_apply(count, DISPATCH_APPLY_AUTO, ^(size_t index) { |
| 69 | + Class class = classes[index]; |
| 70 | + let className = class_getName(class); |
| 71 | + if (strncmp(processName, className, processNameLength) == 0) { |
| 72 | + class_performClassSelector(class, selector); |
| 73 | + } |
| 74 | + }); |
| 75 | + |
62 | 76 | free(classes); |
63 | 77 | } |
64 | 78 |
|
|
0 commit comments