如何在运行时访问 Objective-C class 属性?
How to access Objective-C class properties in runtime?
这就是我所拥有的:
@interface Example : NSObject
@property (class) NSString *classProperty;
@end
并尝试访问 class 属性:
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 模拟器,只想使用 Obj-C 运行时函数访问 class 属性。
我在这里阅读了一些幻灯片: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:
阅读下面我自己的回答。
我不认为你真的能做到这一点。 Class 属性无法合成,也无法自动合成。您负责实施 getter/setter 或使用 @dynamic。这似乎是 class 级别 getter/setter 方法的语法糖,因此没有出现。
请问这是不是暂时的?
你具体想做什么?
在将 Deployment Target
设置为 iOS 8 和 iOS 9+ 时发现完全不同的行为。当 Deployment Target
设置为 iOS 8 时,Objective-C 运行时没有关于 class 属性的信息,当 Deployment Target
设置为 [=16= 时,有所有必要的信息] 9+。所以我正在开发的框架将变成 iOS 9+.
这就是我所拥有的:
@interface Example : NSObject
@property (class) NSString *classProperty;
@end
并尝试访问 class 属性:
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 模拟器,只想使用 Obj-C 运行时函数访问 class 属性。
我在这里阅读了一些幻灯片: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:
阅读下面我自己的回答。
我不认为你真的能做到这一点。 Class 属性无法合成,也无法自动合成。您负责实施 getter/setter 或使用 @dynamic。这似乎是 class 级别 getter/setter 方法的语法糖,因此没有出现。
请问这是不是暂时的?
你具体想做什么?
在将 Deployment Target
设置为 iOS 8 和 iOS 9+ 时发现完全不同的行为。当 Deployment Target
设置为 iOS 8 时,Objective-C 运行时没有关于 class 属性的信息,当 Deployment Target
设置为 [=16= 时,有所有必要的信息] 9+。所以我正在开发的框架将变成 iOS 9+.