我正在编写用于从 python 访问目标 c 的库,所以我使用 Cython 和目标 c 运行时来访问目标 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;
getter 和 setter 被正确调用。但是,我需要从目标 c 运行时设置和获取这个动态属性的值,所以如果我使用像 objc_getIvar/objc_setIvar 这样的函数,getter 和 setter 根本不会被调用,结果我得到的是空指针。
有谁知道如何调用get/set funcs。来自目标 c 运行时的动态属性?
谢谢!