Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 仅获取在标头中声明的对象的属性_Objective C_Cocoa Touch_Serialization_Reflection_Objective C Runtime - Fatal编程技术网

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

Objective c 仅获取在标头中声明的对象的属性,objective-c,cocoa-touch,serialization,reflection,objective-c-runtime,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 *pr

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

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);
MyTest*myTestObj=[[MyTest alloc]init];
myTestObj.prop1=@“prop1”;
myTestObj.prop2=@“prop2”;
NSMutableDictionary*dict=[NSMutableDictionary];
无符号计数;
objc_property_t*properties=class_copyPropertyList([myTestObj class],&count);
for(int i=0;i
(有关更多示例,请参见)

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

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

我正在尝试将对象的状态保存到字典中,以便以后可以重新创建它。具体来说,我正试图把它保存到

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


如果有更好的方法不涉及硬编码,那么我希望听到一些建议。

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

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

那是不可能的

编辑后:

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

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

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

您试图做的事情很奇怪。请看一看NSCoding协议,它是为实现您的目标而设计的。查看头文件中声明的属性是一个非常奇怪的想法。您不知道设置公共属性是否会产生您想要的结果

呃什么?你有“myTestObj”吗?并且您想访问所有公共属性?指定您需要此功能的原因可能是有益的,因为可能有其他方法来完成您尝试执行的操作。如果您的体系结构依赖于此,则可能会被破坏。如果该类是您的自定义类,则可能可以使用前缀作为私有属性,就像
\u privateProperty
。为什么不在
userInfo
dict中传递对象本身,而不是它的所有属性?是的,我已经看过NSCoding协议,但我想知道是否有其他解决方案。我不喜欢NSCoding协议,因为它基本上要求您在
-(id)initWithCoder:(NSCoder*)解码器
-(void)encodeWithCoder:(NSCoder*)编码器
方法中复制属性声明。所以现在,每次我添加一个新属性时,我都必须记住更新这两个方法。我同意寻找公共属性不是选择类的持久键的正确策略。但是,
NSCoding
也没有帮助。感谢您建议使用persistentKeys数组。我也想过这样做,但我们最终还是再次使用某种硬编码。这只是实现NSCoding协议的另一种方法。但是,正如您所指出的,似乎没有办法绕过某种硬编码。我采用了这个答案推荐的方法,使用持久密钥数组,所以我将把它标记为答案。