【发布时间】:2013-07-29 13:02:27
【问题描述】:
我正在编写用于从 python 访问目标 c 的 lib,因此我使用 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 函数。来自目标 c 运行时的动态属性?
谢谢!
【问题讨论】:
-
你调查过pyobjc吗?
-
是的,我查看了 pyobjc 源代码,他们的方法与我不同,但我认为@Nathan Day 的回答会对我有所帮助
-
酷;只是确保你没有重新发明那个特定的轮子。 :)
标签: objective-c objective-c-runtime