2 #include <objc/runtime.h>
6 #include <Foundation/Foundation.h>
8 @interface TargetClass : NSObject
11 @interface TargetClass(LoadedMethods)
30 @implementation TargetClass
33 return class_createInstance(self, 0);
35 - (void) m0; { fail("shoulda been loaded!"); }
36 - (void) m1; { fail("shoulda been loaded!"); }
37 - (void) m2; { fail("shoulda been loaded!"); }
38 - (void) m3; { fail("shoulda been loaded!"); }
39 - (void) m4; { fail("shoulda been loaded!"); }
40 - (void) m5; { fail("shoulda been loaded!"); }
41 - (void) m6; { fail("shoulda been loaded!"); }
44 void *threadFun(void *aTargetClassName) {
45 const char *className = aTargetClassName;
47 objc_registerThreadWithCollector();
49 NSAutoreleasePool *p = [NSAutoreleasePool new];
51 Class targetSubclass = objc_getClass(className);
52 testassert(targetSubclass);
54 id target = [targetSubclass new];
60 [target addObserver: target forKeyPath: @"m3" options: 0 context: NULL];
61 [target addObserver: target forKeyPath: @"m4" options: 0 context: NULL];
68 [target removeObserver: target forKeyPath: @"m4"];
69 [target addObserver: target forKeyPath: @"m5" options: 0 context: NULL];
84 [target removeObserver: target forKeyPath: @"m3"];
85 [target removeObserver: target forKeyPath: @"m5"];
100 sprintf(dlName, "cc%d.out", i);
101 dylib = dlopen(dlName, RTLD_LAZY);
103 sprintf(className, "cc%d", i);
104 pthread_create(&t, NULL, threadFun, strdup(className));