Управление памятью приложения iphone в режиме сохранения / восстановления - PullRequest
1 голос
/ 10 октября 2011

Меня смущает управление памятью в этом сценарии.В моем приложении пользователь делает периодический ввод внутри UITextField tf, и напечатанные строки (NSString *) сохраняются как элементы массива MSMutableArray * через addObject.Сохраненная коллекция отображается внутри UITableView.Мое приложение может войти в bkgr и периодически пробуждается push-уведомлениями.Насколько я понимаю, данные, хранящиеся в arr, могут быть потеряны, когда мое приложение неактивно, и для его сохранения мне нужно выполнить архивирование / восстановление.Мой архив / восстановление использует

NSUserDefaults*prefs;  
[prefs setObjectForKey:x forKey:key] 

для архивирования и

[prefs objectForKey:key]

для восстановления каждого элемента обр.

Вопрос 1: Я думаю, что для предотвращения утечки памяти мне нужно сделать [выпуск релиза] Мне также нужно делать выпуск для каждого объекта, который я добавил в arr или, поскольку я не выделил NSStringдля tf это будет сделано для меня автоматически?

Вопрос2: при восстановлении я начинаю с чего-то вроде arr = [[NSMutableArray alloc] initWithObjects: nil];прежде чем я смогу прочитать и добавить архивные элементы обратно в обр.Я думаю, что [prefs objectForKey: key] освобождается, как только я покидаю область, в которой оно было прочитано - поэтому мне нужно что-то вроде retain, чтобы сохранить его в arr.Будет ли эта схема работать в следующем цикле архивирования / восстановления из-за глубокого сна другого приложения?Есть ли более чистый способ достижения того же самого?Благодарю.Виктор

1 Ответ

2 голосов
/ 10 октября 2011

Добавление объектов в NSArray приводит к тому, что NSArray сохраняет каждый объект.

Так что в случае, когда вы создаете экземпляры объектов, а затем добавляете их в массив, эти объекты не нужно дополнительно хранить:

// saving strings inside an array, then array to the NSUserDefaults
NSString *string1 = @"My String 1";
NSString *string2 = @"My String 1";
NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:10];
[arr addObject:string1];
[arr addObject:string2];

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];;  
[prefs setObject:arr forKey:@"MyArray"];

[arr release];

Затем, чтобы восстановить весь массив из prefs:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; 
NSArray *array = [prefs objectForKey:@"MyArray"];

Альтернативно, чтобы сохранить строки под отдельными ключами, это будет выглядеть примерно так:

[prefs setObject:[arr objectAtIndex:0] forKey:@"MyFirstStringKey"];
[prefs setObject:[arr objectAtIndex:1] forKey:@"MySecondStringKey"];

Для восстановления вы также просто добавите элементы в массив, сохранение не требуется:

// assuming this time several keys added to an array
// also note using autoreleased version of array - much easier
NSMutableArray *arr = [NSMutableArray arrayWithCapacity:10];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];;  
[arr addObject:[prefs objectForKey:@"MyFirstStringKey"]];
[arr addObject:[prefs objectForKey:@"MySecondStringKey"]];

// then assign arr or use it otherwise

Также проще использовать не изменяемый массив и создать экземпляр массива со списком объектов, которые выхотите иметь в массиве:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];;  
NSArray *arr = [NSArray arrayWithObjects:[prefs objectForKey:@"MyFirstStringKey"], [prefs objectForKey:@"MySecondStringKey"], nil];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...