仅获取标头中声明的对象的属性

时间:2014-07-21 15:36:55

标签: objective-c cocoa-touch serialization reflection objective-c-runtime

我正在寻找一种方法,在运行时只访问在该类的头文件中声明的对象的属性。我能够通过以下代码检索对象的所有属性:

MyTest *myTestObj = [[MyTest alloc] init];
myTestObj.prop1 = @"prop1";
myTestObj.prop2 = @"prop2";

NSMutableDictionary *dict = [NSMutableDictionary dictionary];

unsigned count;
objc_property_t *properties = class_copyPropertyList([myTestObj class], &count);

for (int i = 0; i < count; i++) {
    NSString *key = [NSString stringWithUTF8String:property_getName(properties[i])];
    id keyValue = [myTestObj valueForKey:key];

    if (keyValue != nil) {
        [dict setObject:keyValue forKey:key];
    }
}

free(properties);

(有关更多示例,请参阅Get an object properties list in Objective-C

但是,我需要一种方法来将检索到的属性限制为仅在.h文件中声明的属性。

基本上,我正在寻找一种访问对象公共界面的方法。任何关于如何做到这一点的建议将不胜感激。

我试图将对象的状态保存在字典中,以便以后可以重新创建。具体来说,我试图将其保存到userInfo property of UILocalNotification

我将对象的状态(在我的情况下为UIViewController)保存到userInfo属性并创建本地通知。当用户通过通知打开应用程序时,我想重新创建相同的UIViewController并将其状态设置为创建通知时的状态。

如果有更好的方法做到这一点并不涉及硬编码,那么我很乐意听取一些建议。

2 个答案:

答案 0 :(得分:1)

在标头或类扩展(或其他地方的类别)中声明属性不会更改属性的可用运行时信息。

  

我需要一种方法来将检索到的属性限制为仅在.h文件中声明的属性

没有办法做到这一点。

编辑后:

另一方面,添加一个返回一组要序列化的键的属性或方法是一种非常常见的模式。例如,您可以使所有模型类实现如下方法:

+ (NSArray *)persistentKeys
{
    return @[ @"name", @"color", @"foo" ];
}

对于序列化序列化代码的每个对象,必须遍历对象的类和超类并收集所有持久密钥。

答案 1 :(得分:1)

你想要做的是奇怪的。请查看设计的NSCoding协议,以执行您想要执行的操作。查看头文件中声明的属性是一个非常奇怪的想法。您不知道设置公共属性是否具有您想要的结果。