|
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