我正在爲從python訪問目標c編寫lib,所以我使用Cython和目標c運行時訪問目標c。讓我們說用戶聲明這樣的屬性:從目標c運行時調用目標c @dynamic屬性的問題
@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);
如果我們從Objective C的呼籲是這樣的:
c.prop_nsstring_dyn = @"test str";
或
c.prop_nsstring_dyn;
getters and setters are call正確編輯。 但是,我需要設置並從目標c運行時獲得這個動態屬性的值,所以如果我使用像objc_getIvar/objc_setIvar這樣的函數,getters和setters根本不會被調用,並且我得到空指針作爲結果。
有沒有人知道如何調用get/set funcs。來自客觀c運行時的動態屬性?
謝謝!
你有調查pyobjc嗎? – bbum
是的,我看着pyobjc源碼,他們有不同的方法比我,但我認爲@Nathan日的答案將幫助我 – user232343
很酷;只是要確保你不是在重新發明特定的車輪。 :) – bbum