66 lines
1.3 KiB
Plaintext
66 lines
1.3 KiB
Plaintext
#import <Foundation/Foundation.h>
|
|
#include <objc/message.h>
|
|
#include <stdio.h>
|
|
|
|
@interface Foo : NSObject
|
|
@end
|
|
|
|
@implementation Foo
|
|
- (void)bar {
|
|
NSLog(@"[Foo bar]: %@", self);
|
|
}
|
|
@end
|
|
|
|
@interface Bar : NSObject
|
|
@end
|
|
|
|
@implementation Bar
|
|
static int x;
|
|
|
|
+ (void)load {
|
|
NSLog(@"%@", self);
|
|
// NSLog(@"x=%d", x)
|
|
printf("printf in [Bar load]\n");
|
|
x = 1;
|
|
}
|
|
|
|
- (void)dummy {
|
|
NSLog(@"dummy bar x=%d", x);
|
|
}
|
|
@end
|
|
|
|
|
|
__attribute__((constructor)) static void
|
|
hmmge(int argc, char** argv) {
|
|
// create a dummy blank function to be replaced to call OBJC load
|
|
printf("hmmge=%p\n", hmmge);
|
|
printf("hmmge argc=%d\n", argc);
|
|
for (int i = 0; i < argc; i++) {
|
|
printf(" hmmge argv[%d]=%s\n", i, argv[i]);
|
|
}
|
|
NSLog(@"hmmge in objc-c");
|
|
Bar *bar = [[Bar alloc] init];
|
|
[bar dummy];
|
|
}
|
|
|
|
int main(int argc, const char * argv[]) {
|
|
@autoreleasepool {
|
|
NSLog(@"main()");
|
|
NSLog(@"selector for \"bar:\" %p", @selector(bar:));
|
|
|
|
Foo *foo = [[Foo alloc] init];
|
|
[foo bar];
|
|
|
|
NSLog(@"directly call \"bar\" %p through objc_msgSend %p with object foo %p\n", @selector(bar), objc_msgSend, foo);
|
|
typedef void (*barfunc)(id, SEL);
|
|
barfunc bar_ = (barfunc)&objc_msgSend;
|
|
bar_(foo, @selector(bar));
|
|
}
|
|
|
|
printf("argc=%d\n", argc);
|
|
for (int i = 0; i < argc; i++) {
|
|
printf(" argv[%d]=%s\n", i, argv[i]);
|
|
}
|
|
return 0;
|
|
}
|