私は Python から目的の c にアクセスするための lib を作成しているので、目的の c へのアクセスには Cython と目的の c ランタイムを使用しています。ユーザーがこの方法でプロパティを宣言するとしましょう:
@property (assign) NSString *prop_nsstring_dyn;
そして、このプロパティで @dynamic を使用したいと考えています。よし、このマクロを使ってみましょう:
#define ADD_DYNAMIC_PROPERTY(PROPERTY_TYPE, PROPERTY_NAME, SETTER_NAME) \
\
@dynamic prop_nsstring_dyn; \
- ( PROPERTY_TYPE ) PROPERTY_NAME \
{ \
printf("returning\n"); \
return ( PROPERTY_TYPE ) objc_getAssociatedObject(self, @selector(PROPERTY_NAME)); \
} \
\
- (void) SETTER_NAME :( PROPERTY_TYPE ) PROPERTY_NAME \
{ \
printf("setting\n"); \
objc_setAssociatedObject(self, @selector(PROPERTY_NAME), PROPERTY_NAME, OBJC_ASSOCIATION_RETAIN); \
} \
この後、@implementation でこれを呼び出すことができます。
ADD_DYNAMIC_PROPERTY(NSString*, prop_nsstring_dyn, setProp_nsstring_dyn);
そして、この方法で目的 c から呼び出すと:
c.prop_nsstring_dyn = @"test str";
また
c.prop_nsstring_dyn;
ゲッターとセッターが正しく呼び出されます。しかし、目的の C ランタイムからこの動的プロパティの値を設定および取得する必要があるため、objc_getIvar/objc_setIvar ゲッターおよびセッターなどの関数を使用すると、まったく呼び出されず、結果として null ポインターが取得されます。
get/set 関数を呼び出す方法について何か知っている人はいますか。目的のCランタイムからの動的プロパティの?
ありがとうございました!