如何在运行时访问Objective-C类属性?

时间:2016-09-23 22:42:39

标签: objective-c llvm-clang objective-c-runtime

这就是我所拥有的:

@interface Example : NSObject

@property (class) NSString *classProperty;

@end

尝试访问类属性:

Class meta = objc_getMetaClass(class_getName([Example class]));
objc_property_t property = class_getProperty(meta, "classProperty"); // == nil
objc_property_t *properties = class_copyPropertyList(meta, NULL); // == nil

我正在使用Xcode 8和iPhone 7 iOS 10 Simulator,只想使用Obj-C运行时函数访问类属性。

我在这里阅读了一些幻灯片:https://developer.apple.com/videos/play/wwdc2016/405/ 并在此处阅读一些信息:http://useyourloaf.com/blog/objective-c-class-properties/

同时选中#if __has_feature(objc_class_property),其中包含:Macro to detect availability of class properties in Objective-C

更新

奇怪的事情发生了:今天这个代码工作正常。我相信昨天我有一个合适的时刻,但后来却没有。

更新2:

请阅读下面的答案。

2 个答案:

答案 0 :(得分:1)

Deployment Target设置为iOS 8和iOS 9+时,发现完全不同的行为。当Deployment Target设置为iOS 8时,Objective-C运行时没有关于类属性的信息,并且当Deployment Target设置为iOS 9+时,它具有所有必需的信息。所以我正在开发的框架将成为iOS 9 +。

答案 1 :(得分:0)

我认为你实际上无法做到这一点。类属性不能合成,也不能自动合成。您负责实施getter / setter或使用@dynamic。这似乎是类级别getter / setter方法的语法糖,因此没有显示出来。

我想知道这是暂时的吗?

你具体想做什么?