从 NSData 取消存档后,我的对象数据成员 (NSString *) 值被“0x7fc0ab73d040”污染

My Objects data member (NSString *) value contaminated '0x7fc0ab73d040' after UnArchiving from NSData

我现在几乎一整天都处于如此忙碌的状态。 请查看并告诉您是否可以提供帮助...

这里我使用我的 CustomObjects('Alarm Object' 用 NSCoder 实现),将它保存到 NSUserDefaults

AlarmObject 有一个 属性 (NSString *) 'tuneAddress',其值类似于

"tunes/Alarm%20clock%20ringtones%20-%20free%20download.%20Mp3%20Alarm%20clock%20tones,%20sounds%20and%20ringtones%20for%20mobile%20phones.mp3"

我知道像这样 (%20) 在地址中解析空格是不好的,但不知何故我无法更改它。它来自我无法控制的服务器。

嗯, 第一个问题 这里的问题是每当我使用 "NSKeyedArchiver archivedDataWithRootObject" 将一些对象添加到 NSUserDefaults 并使用上面显示的适当的值到 'tuneAddress' 并尝试将其恢复时"NSKeyedUnarchiver unarchiveObjectWithData"。

在这里,我取回 'tuneAddress' 值为“0x7fc0ab73d040”的对象。 请看一下如果你能说说这是什么..?

第二期 依赖于第一期,当我尝试通过 "NSKeyedArchiver archivedDataWithRootObject" 将其存档时,它停在这里

[encoder encodeObject:self.tuneLocalAddress forKey:@"tuneLocalAddress"];

显示错误 EXC_BAD_ACCESS(代码=EXC_i386_GPFLT)。

下面是我如何将指向的字符串保存到 AlarmObject 的一个小例子

[[NSUserDefaults standardUserDefaults] setObject:[newString stringByReplacingOccurrencesOfString:@" " withString:@"%20"] forKey:TuneChoosenForAlarm_Key];

AlarmObject * newAlarmObj = [[AlarmObject alloc] init];
newAlarmObj.tuneLocalAddress = [[NSUserDefaults standardUserDefaults] objectForKey:TuneChoosenForAlarm_Key];

NSMutableArray * newArray = [[NSMutableArray alloc] initWithObjects:newAlarmObj, nil];

for (AlarmObject * alarmObj in self.alarmsArray) {
        [newArray addObject:alarmObj];
}
self.alarmsArray = newArray;

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.alarmsArray];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:AlarmsDataDictonaryKey];

到这里,我找到了原因,错在底层。在创建 'AlarmObject' 时这里是 'tuneLocalAddress' 并且内存 属性 "assign" 这正是我错的地方。

如果您正在使用 ARC 并希望在内存中保留某些 属性 (tuneLocalAddress) 的值直到该对象被使用,您应该使用 'retain' 或 'strong' 从 here 得到一点点想法。

希望您能理解。 对不起,任何语法错误。