実行時にメソッドを取得し、そのデータ構造を使用してその実装を呼び出そうとしています。明確にするために、これは学習目的であり、実用的な理由ではありません。だからここに私のコードがあります。
#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;
}
の定義struct objc_method
は以下の通り(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;
ただし、コードをコンパイルしようとすると、このエラーが発生します。
error: dereferencing pointer to incomplete type
しかし、これを (objc_method を明示的に宣言するために) コードに追加すると、期待どおりに機能します。
struct objc_method {
SEL method_name;
char *method_types;
IMP method_imp;
};
typedef struct objc_method* Method;
objc/runtime.h からインポートしたときではなく、この構造を明示的に宣言したときにコードが機能する理由を誰かに説明してもらえますか? OBJC2_UNAVAILABLE と何か関係がありますか? その定義が見つかりませんが、私の環境では定義されています。
編集:
OBJC2_UNAVAILABLEgcc -E code.m -o out.m
が何に置き換えられるかを調べてみたところ、私の環境では OBJC2_UNAVAILABLE が __attribute__((unavailable)) として定義されていることがわかりました。Method
この構造が「利用できない」場合、誰かがそれが何を意味し、なぜまだ機能するのかを説明できますか?