gpt4 book ai didi

ios - 将 NSObject 的所有属性编码为 NSData

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:51:16 25 4
gpt4 key购买 nike

所以我是 iOS 的新手,但我对一项简单任务的复杂性感到有点困惑。我试图在 NSUserDefaults 中存储名为“Vehicle”的自定义 NSObject 类。显然,这是做不到的,所以我需要先将它编码为 NSDATA。很好。

但这意味着我需要在解码中对类的每个属性进行编码......

在我的 Vehicle 类中...

- (void) encodeWithCoder: (NSCoder *) coder
{
[coder encodeInt: x forKey: @"x"];
[coder encodeInt: y forKey: @"y"];
[coder encodeInt: direction forKey: @"direction"];

} // encodeWithCoder

- (id) initWithCoder: (NSCoder *) coder
{
if (self = [super init]) {
x = [coder decodeIntForKey: @"x"];
y = [coder decodeIntForKey: @"y"];
direction = [coder decodeIntForKey: @"direction"];
}

return (self);

} // initWithCoder

如果我最终要向车辆类添加一个新属性,我还必须添加编码和解码逻辑。这与使用 CopyWithZone 创建类的副本相同。这留下了 3 或 4 个区域,在这些区域中,向类添加新属性可能会出错。

我目前主要在 LabVIEW 中编程,我们有能力接受一个类,并将其提供给编码器,编码器将自动执行所有版本控制和属性操作。

所以我想我的问题是:

  1. 在 iOS 中没有听说过吗?
  2. 如果不可能,是否有办法枚举类中的所有属性并编写一个函数来自动执行此操作。

最佳答案

您可以使用 objective-c 运行时来查找对象的所有属性并对其进行解码,但我不推荐这样做。如果您愿意,我可以为您创建一个简单的示例。

编辑:这是一个例子:

#import <objc/runtime.h>

void decodePropertiesOfObjectFromCoder(id obj, NSCoder *coder)
{
// copy the property list
unsigned propertyCount;
objc_property_t *properties = class_copyPropertyList([obj class], &propertyCount);

for (int i = 0; i < propertyCount; i++) {
objc_property_t property = properties[i];

char *readonly = property_copyAttributeValue(property, "R");
if (readonly)
{
free(readonly);
continue;
}

NSString *propName = [NSString stringWithUTF8String:property_getName(property)];

@try
{
[obj setValue:[coder decodeObjectForKey:propName] forKey:propName];
}
@catch (NSException *exception) {
if (![exception.name isEqualToString:@"NSUnknownKeyException"])
{
@throw exception;
}

NSLog(@"Couldn't decode value for key %@.", propName);
}
}

free(properties);
}

void encodePropertiesOfObjectToCoder(id obj, NSCoder *coder)
{
// copy the property list
unsigned propertyCount;
objc_property_t *properties = class_copyPropertyList([obj class], &propertyCount);

for (int i = 0; i < propertyCount; i++) {
objc_property_t property = properties[i];

char *readonly = property_copyAttributeValue(property, "R");
if (readonly)
{
free(readonly);
continue;
}

NSString *propName = [NSString stringWithUTF8String:property_getName(property)];

@try {
[coder encodeObject:[obj valueForKey:propName] forKey:propName];
}
@catch (NSException *exception) {
if (![exception.name isEqualToString:@"NSUnknownKeyException"])
{
@throw exception;
}

NSLog(@"Couldn't encode value for key %@.", propName);
}
}

free(properties);
}

__attribute__((constructor))
static void setDefaultNSCodingHandler()
{
class_addMethod([NSObject class], @selector(encodeWithCoder:), imp_implementationWithBlock((__bridge void *)[^(id self, NSCoder *coder) {
encodePropertiesOfObjectToCoder(self, coder);
} copy]), "v@:@");
class_addMethod([NSObject class], @selector(initWithCoder:), imp_implementationWithBlock((__bridge void *)[^(id self, NSCoder *coder) {
if ((self = [NSObject instanceMethodForSelector:@selector(init)](self, @selector(init))))
{
decodePropertiesOfObjectFromCoder(self, coder);
}

return self;
} copy]), "v@:@");
}

这允许您对任何公开足够属性以重建自身的对象进行编码。

关于ios - 将 NSObject 的所有属性编码为 NSData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10705022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com