在objective-c中获取属性是否设置为只读信息的方法

在objective-c中获取属性是否设置为只读信息的方法,objective-c,properties,readonly,objective-c-runtime,Objective C,Properties,Readonly,Objective C Runtime,我在objective-c中获得了一些声明为只读的属性,例如: @property (nonatomic, readonly) NSString* aProperty; 我希望获得有关属性可读性的信息,以区别对待它们(例如,更改有关它们的信息在GUI中的显示方式)。这就是为什么我需要一种方法来询问属性是否为只读(我有一个属性名及其包含的对象的列表)。有没有办法做到这一点例如,使用objective-c运行时 objc_property_t prop = class_getPropert

我在objective-c中获得了一些声明为只读的属性,例如:

@property (nonatomic, readonly) NSString* aProperty;
我希望获得有关属性可读性的信息,以区别对待它们(例如,更改有关它们的信息在GUI中的显示方式)。这就是为什么我需要一种方法来询问属性是否为只读(我有一个属性名及其包含的对象的列表)。有没有办法做到这一点例如,使用objective-c运行时

    objc_property_t prop = class_getProperty([object class], [aProperty UTF8String]);
    if (!prop) {
       // doesn't exist for object
       return nil;
    }
    const char * propAttr = property_getAttributes(prop);
    NSString *propString = [NSString stringWithUTF8String:propAttr];
    NSArray *attrArray = [propString componentsSeparatedByString:@","];

attrArray将包含引用此属性的所有属性,以使其更简单、更快速:

objc_property_t prop = class_getProperty([object class], "aProperty");
const char * roAttr *property_copyAttributeValue(property, "R");
  • 我不相信属性是使用UTF8编码的。;-)但这不应该有任何区别

  • 这样,您就不必构造许多NSString实例

  • 您不必拾取所需的属性

  • 始终查看标题。它是文档的一部分。(属性_copyAttribteValue()仅在运行时记录。h.)

  • 考虑使用object_getClass()而不是[object class]。这取决于任务,你必须解决


  • 好的,它是UTF-8或ASCII,任何用ASCII正确编码的东西也用UTF-8正确编码,所以这没有问题。请注意,属性通常公开声明为只读,私下声明为读写。不确定这会对代码产生什么影响。