I'm trying to get a Method at runtime and then use its data structure to call it's implementation. Just to clarify, this is for learning purposes, not for any practical reason. So here is my code.
#import <Foundation/Foundation.h>
#import <stdio.h>
#import <objc/runtime.h>
@interface Test : NSObject
-(void)method;
@end
@implementation Test
-(void)method {
puts("this is a method");
}
@end
int main(int argc, char *argv[]) {
struct objc_method *t = (struct objc_method*) class_getInstanceMethod([Test class], @selector(method));
Test *ztest = [Test new];
(t->method_imp)(ztest, t->method_name);
[ztest release];
return 0;
}
The definition of struct objc_method
is as follows (defined in objc/runtime.h)
typedef struct objc_method *Method;
....
struct objc_method {
SEL method_name OBJC2_UNAVAILABLE;
char *method_types OBJC2_UNAVAILABLE;
IMP method_imp OBJC2_UNAVAILABLE;
} OBJC2_UNAVAILABLE;
however when I try to compile my code, I get this error.
error: dereferencing pointer to incomplete type
But when I add this to my code (to explicitly declare an objc_method), it works just as expected.
struct objc_method {
SEL method_name;
char *method_types;
IMP method_imp;
};
typedef struct objc_method* Method;
Could someone explain to me why my code works when I explicitly declare this structure, and not when I import it from objc/runtime.h? Does it have anything to do with OBJC2_UNAVAILABLE? I can't find a definition for that, but it is defined in my environment.
EDIT:
I ran gcc -E code.m -o out.m
to see what OBJC2_UNAVAILABLE was getting replaced with, it turns out that OBJC2_UNAVAILABLE was defined as __attribute__((unavailable)) in my environment. Can someone explain what that means and why Method
still works if this structure is "unavailable"?