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

时间:2016-10-13 14:18:59

标签: ios objective-c nsstring nsdata nscoder

我现在处于如此紧张的状态,差不多整整一天。 请看看并告诉你是否可以提供帮助......

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

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

  

“曲调/报警%20clock%20ringtones%20-%20free%20download。%20Mp3%20Alarm%20clock%20tones,%20sounds%20于是%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(code = 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];

1 个答案:

答案 0 :(得分:0)

在这里,我找到了原因,错误是在基级。虽然在这里创建'AlarmObject'是'tuneLocalAddress',其内存属性为“assign”,这正是我错误的地方。

如果您正在使用ARC并且想要在内存中保留某些属性(tuneLocalAddress)的值,​​直到该对象正在使用中,那么您应该使用{retain'或'strong'从{{3}获得一点想法}。

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

相关问题