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



我现在几乎一整天都在忙乱中。如果你能帮忙,请告诉我……

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

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

"音乐/报警% 20钟% 20铃声% 20 - % 20自由% 20 download. % 20 mp3 % 20报警% 20钟% 20音调,% 20听起来% 20和% 20铃声% 20 % 20移动% 20 phones.mp3"

我知道像这样在地址中解析空格是不好的(%20),但不知何故我无法改变这一点。

,第一个问题这里的问题是每当我添加一些对象到NSUserDefaults使用"NSKeyedArchiver archivedDataWithRootObject"与适当的这样的值如上所示的"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];

在这里,我找到了原因,错误在基层。而创建'AlarmObject'这里是'tuneLocalAddress'与内存属性"分配"这正是我错了。

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

我希望你能理解。抱歉,有任何语法错误。

最新更新