gpt4 book ai didi

objective-c - 在 Cocoa 中将自定义对象写入 .plist

转载 作者:太空狗 更新时间:2023-10-30 03:46:40 28 4
gpt4 key购买 nike

我正在阻塞某些东西,我确定它太大了。我有一个看起来像这样的自定义对象

 @interface DownloadObject : NSObject <NSCoding>{
NSNumber *key;
NSString *name;
NSNumber *progress;
NSNumber *progressBytes;
NSNumber *size;
NSString *path;
}
@property (copy) NSNumber *key;
@property (copy) NSString *name;
@property (copy) NSNumber *progress;
@property (copy) NSNumber *size;
@property (copy) NSString *path;
@property (copy) NSNumber *progressBytes;
-(id)initWithKey:(NSNumber *)k name:(NSString *)n progress:(NSNumber *)pro size:(NSNumber *)s path:(NSString *)p progressBytes:(NSNumber *)pb;
@end

和实现

  @implementation DownloadObject
@synthesize size, progress, name, key, path, progressBytes;

-(id)initWithKey:(NSNumber *)k name:(NSString *)n progress:(NSNumber *)pro size:(NSNumber *)s path:(NSString *)p progressBytes:(NSNumber *)pb
{
self.key = k;
self.name = n;
self.progress = pro;
self.size = s;
self.path = p;
self.progressBytes = pb;

return self;
}

-(id) initWithCoder: (NSCoder*) coder {
if (self = [super init]) {
self.key = [[coder decodeObjectForKey:@"Key"] retain];
self.name = [[coder decodeObjectForKey:@"Name"] retain];
self.progress = [[coder decodeObjectForKey:@"Progress"] retain];
self.size = [[coder decodeObjectForKey:@"Size"] retain];
self.path = [[coder decodeObjectForKey:@"Path"] retain];
self.progressBytes = [[coder decodeObjectForKey:@"ProgressBytes"]retain];
}
return self;
}


-(void) encodeWithCoder: (NSCoder*) coder {
[coder encodeObject:self.key forKey:@"Key"];
[coder encodeObject:self.name forKey:@"Name"];
[coder encodeObject:self.progress forKey:@"Progress"];
[coder encodeObject:self.size forKey:@"Size"];
[coder encodeObject:self.path forKey:@"Path"];
[coder encodeObject:self.progressBytes forKey:@"ProgressBytes"];
}


-(void)dealloc
{
[key release];
[name release];
[size release];
[progress release];
[path release];
[progressBytes release];
[super dealloc];
}

@end

如你所见,它实现了 NSCoding(我认为是的,NSObject 不符合 NSCoding)。现在,当我尝试做类似的事情来测试时

downloadArray = [[[NSMutableArray alloc]init]retain];
NSNumber *number = [NSNumber numberWithInt:10];
DownloadObject *object = [[DownloadObject alloc]initWithKey:number name:@"hey" progress:number size:number path:@"hey" progressBytes:number];
[downloadArray addObject:object];
[object release];
[downloadArray writeToFile:path atomically:YES];

downloadArray 是一个 NSMutableArray。我的 plist 读/写很好,path 位于应用程序支持中,当我登录它时显示 plist 路径。

但它只是不将数组写入 plist,知道吗?

最佳答案

属性列表文件只能存储基本数据类型,不能包含自定义对象。如果要将对象写入 plist,则需要将对象转换为 NSData 对象。您可以使用 NSKeyedArchiver 执行此操作,它将符合 NSCoding 协议(protocol)的对象编码为 NSData 对象。

DownloadObject *object = [[DownloadObject alloc]initWithKey:number name:@"hey" progress:number size:number path:@"hey" progressBytes:number];
NSData* objData = [NSKeyedArchiver archivedDataWithRootObject:object];
[downloadArray addObject:objData];
[object release];

当你想从 NSData 对象重建你的对象时,你可以使用 NSKeyedUnarchiver:

NSData* objData = [downloadArray objectAtIndex:0];
DownloadObject* object = [NSKeyedUnarchiver unarchiveObjectWithData:objData];

您的代码中还有一些内存泄漏。在你的 -initWithCoder: 方法中,你不应该使用访问器来设置 ivars 的值,你应该直接设置 ivars,就像这样:

key = [[coder decodeObjectForKey:@"Key"] copy];

您正在调用 -retain,然后使用指定为 copy 的访问器,这意味着您的对象的保留计数为 2,并且不会被释放。通常,您应该避免在 init 方法中使用访问器。

此外,在您分配 downloadArray 对象的代码中,您正在调用 -alloc 然后在对象上调用 -retain,这将保留它的 retainCount 为 2。您应该重新阅读 Objective-C Memory Management Guidelines .

关于objective-c - 在 Cocoa 中将自定义对象写入 .plist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6569207/

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