从 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 得到一点点想法。
希望您能理解。
对不起,任何语法错误。
我现在几乎一整天都处于如此忙碌的状态。 请查看并告诉您是否可以提供帮助...
这里我使用我的 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 得到一点点想法。
希望您能理解。 对不起,任何语法错误。