【问题标题】:My Objects data member (NSString *) value contaminated '0x7fc0ab73d040' after UnArchiving from NSData从 NSData 取消存档后,我的对象数据成员 (NSString *) 值被污染“0x7fc0ab73d040”
【发布时间】:2016-10-13 14:18:59
【问题描述】:

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

这里我使用的是我的 CustomObjects(使用 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(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];

【问题讨论】:

  • stackoverflow.com/questions/7920071/…,用它来转换成普通字符串,然后执行归档/取消归档。
  • 请粘贴您的代码。
  • 您保存的数据方式和内容。
  • @vadian,感谢您正确格式化代码部分。你能帮我弄清楚我的方法犯了什么错误吗?

标签: ios objective-c nsstring nsdata nscoder


【解决方案1】:

在这里,我找到了原因,错误是在基础级别。在此处创建“AlarmObject”时,“tuneLocalAddress”具有内存属性“分配”,这正是我错的地方。

如果您正在使用 ARC 并希望在内存中保留某些属性 (tuneLocalAddress) 的值直到该对象被使用,您应该使用 'retain' 或 'strong' 来了解here

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

【讨论】:

    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    相关资源
    最近更新 更多