2016-10-13 12 views
0

Я сейчас в такой суматошной ситуации почти целый день. Пожалуйста, смотрите и скажите, если вы можете помочь ...Значение объекта данных «Мои объекты» (NSString *) загрязнено «0x7fc0ab73d040» после UnArchiving из NSData

Здесь я использую мои CustomObjects ('Alarm Object' реализован с NSCoder), сохранив его в NSUserDefaults

AlarmObject имеет одно свойство (NSString *) «tuneAddress 'имеет значение как

"мелодии/Alarm% 20clock% 20ringtones% 20-% 20Free% 20download.% 20Mp3% 20Alarm% 20clock% 20tones,% 20sounds% 20and% 20ringtones% 20for% 20mobile% 20phones.mp3"

I k теперь нехорошо разрешать пробелы в адресе, подобном этому (% 20), но каким-то образом я не могу это изменить. Это происходит от сервера, который еще не находится под моим контролем.

Ну, Первый выпуск проблема здесь всякий раз, когда я добавить объект NSUserDefaults с помощью «NSKeyedArchiver archivedDataWithRootObject» с правильной такого значения, как показано выше «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]; 
+0

http://stackoverflow.com/questions/7920071/how-to-url-decode-in-ios-objective-c, используйте это, чтобы преобразовать в обычную строку, а затем выполнить архив/разблокировать. –

+0

Вставьте свой код, пожалуйста. –

+0

Как и какие данные вы сохраняете. –

ответ

0

Здесь я нашел причину, ошибка была на базовом уровне. При создании «AlarmObject» здесь был «tuneLocalAddress» с свойством памяти «присваивать» это именно там, где я был неправ.

Если вы работаете с ARC и хотите сохранить значение некоторого свойства (tuneLocalAddress) в памяти до тех пор, пока этот объект не будет использован, вы должны использовать «сохранить» или «сильно», имея небольшую идею от here.

Надеюсь, вы можете понять. Извините, за любые ошибки грамматики.