gpt4 book ai didi

objective-c - NSUserDefaults 无法保存和读取我的自定义对象

转载 作者:行者123 更新时间:2023-12-03 17:35:11 24 4
gpt4 key购买 nike

我有一个实现 NSCoding 协议(protocol)的通知类。
我有一组通知。我正在尝试使用 NSUserDefaults 保存通知。在我的应用程序委托(delegate)通知中,是一个包含通知对象的 NSMutableArray。这是我的应用程序委托(delegate):

+ (void) initialize
{
NSUserDefaults* defaults=[NSUserDefaults standardUserDefaults];
[defaults registerDefaults: [NSDictionary dictionaryWithObject: [NSKeyedArchiver archivedDataWithRootObject: [NSArray array]] forKey: @"notificationsData"]];
}


- (id) init
{
self=[super init];
if(self)
{
NSUserDefaults* defaults=[NSUserDefaults standardUserDefaults];
NSData* notificationsData=[defaults objectForKey: @"notificationsData"];
notifications= [[NSKeyedUnarchiver unarchiveObjectWithData: notificationsData]mutableCopy];
}
return self;
}

- (void) applicationWillTerminate:(NSNotification *)notification
{
NSUserDefaults* defaults=[NSUserDefaults standardUserDefaults];
NSData* notificationsData=[NSKeyedArchiver archivedDataWithRootObject: notifications];
[defaults setObject: notificationsData forKey: @"notificationsData"];
}

在通知类中,文本和标题的类型为 NSString(均为读写),日期的类型为 NSDate(也具有读写属性)。这就是我实现 NSCoding 协议(protocol)的方式:

- (void) encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject: date forKey: @"date"];
[aCoder encodeObject: title forKey: @"title"];
[aCoder encodeObject: text forKey: @"text"];
}

- (id) initWithCoder:(NSCoder *)aDecoder
{
self=[super init];
if(self)
{
date=[aDecoder decodeObjectForKey: @"data"];
title=[aDecoder decodeObjectForKey: @"title"];
text=[aDecoder decodeObjectForKey: @"text"];
}
return self;
}

所以我有这些问题:

  1. 当应用程序终止时,我在通知类,当我尝试使用 NSKeyedArchiver 编码文本时;
  2. 通知不会保存,并且数组始终为长零当应用程序启动时。

更新:通过更多调试,我发现了应用程序崩溃的位置。还有更多代码可供查看(我正在使用表格 View 来显示数据):

- (NSInteger) numberOfRowsInTableView:(NSTableView *)tableView
{
return [notifications count];
}

- (id) tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
// Debug
id obj=[[notifications objectAtIndex: row] valueForKey: [tableColumn identifier]];
Class class=[obj class];
// What you see above is just for debug purposes
return [[notifications objectAtIndex: row] valueForKey: [tableColumn identifier]];
}

- (void) tableViewSelectionDidChange:(NSNotification *)notification
{
NSInteger row=[tableView selectedRow];
if(row >= 0 && row< [notifications count])
[removeButton setEnabled: YES];
else
[removeButton setEnabled: NO];
}

最后调用的方法是:

- (id) tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row;

问题可能是数据以某种方式损坏,并且此方法返回的值无效。无论如何,应用程序不会在此方法中崩溃,而是在此方法之后崩溃。
如果我从用户默认值加载两个对象,则在崩溃之前只会加载一个对象(因此该方法被调用一次)。
但是我仍然无法了解崩溃的真正原因。

更多代码:

- (IBAction) addNotification :(id)sender
{
Notification* notification=[[Notification alloc]init];
[notification setDate: [datePicker dateValue]];
[notification setText: [textView string]];
[notifications addObject: notification];
[tableView reloadData];
}

- (IBAction)removeNotification:(id)sender
{
[notifications removeObjectAtIndex: [tableView selectedRow]];
[tableView reloadData];
}

addNotification和removeNotification都是由按钮触发的。

编辑:我发现我没有使用 ARC,但即使我打开它,应用程序也会崩溃。

最佳答案

行中:

date=[aDecoder decodeObjectForKey: @"data"];

@"data" 与编码器 key 不匹配。你真正想要的是:

date=[aDecoder decodeObjectForKey: @"date"];

关于objective-c - NSUserDefaults 无法保存和读取我的自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13126891/

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