Как в iOS работает (неатомный, сильный) ресурс собственности?

Скажем, у меня есть свойство, объявленное как @property (nonatomic, strong) NSArray *menuArr; ИЛИ @property (strong) NSArray *menuArr;, и установите это свойство в viewDidLoad. Как долго устройство "запомнит" информацию, которую я сохранил в массиве?

Свойство объявляется и устанавливается в viewController, встроенном в navigationViewController, который сам является первым контроллером представления в TabBarViewController. Другими словами, это первый взгляд, который видит пользователь, затем они могут перемещаться от него и обратно.

Не вдаваясь в дискуссию об атомном и неатомном, мой вопрос в том, что это

Означает ли свойство (объявленное в любом случае) бесконечно в среде iOS или его продолжительность ограничена такими факторами, как время, использование памяти в другом месте, выключение устройства и т.д.


Чтобы избежать этой проблемы "x y" здесь, почему Im спрашивает:

Im работает над приложением, которое включает в себя меню, разбитое на несколько категорий с несколькими элементами в каждой категории..... как вы могли ожидать, что это меню. Все пункты меню хранятся на parse.com. Сначала я делал отдельный PFQuery на каждой странице, один на странице категорий, чтобы получить категории, когда пользователь выбирает категорию, на которую нажимается новая страница, а второй PFQuery получает все предметы в выбранной категории. Это сработало, но страницы заняли довольно много времени, чтобы нагрузить, возможно, 10-15 секунд, иногда без реального указания на то, что приложение не застыло.

Чтобы исправить это, я решил запустить один PFQuery, когда первое представление приложения загрузилось в viewDidLoad, чтобы получить все пункты меню и отсортировать себя во вложенные массивы категорий, содержащих элементы. Затем я сохраняю массив меню в свойстве viewController. Позже, когда я иду в меню, у меня есть внизу viewDidLoad:

//get e reference to the first view controller, the one that has the menu array 
FirstViewController *myVC1ref = (FirstViewController *)[[[self.navigationController.tabBarController.viewControllers objectAtIndex:0] viewControllers]  objectAtIndex:0];

//set thisviewController `menuArr` property to point to the menuArr on the first viewController.

_menuArr=myVC1ref.menuArr;

Я понимаю, что это создает указатель на исходный массив и фактически не создает второй массив (пожалуйста, исправьте меня, если я ошибаюсь).

Этот метод занимает около 10-15 секунд для загрузки и сортировки массива, который один раз, но затем перемещение между страницами происходит мгновенно после того, что намного лучше.

Я планирую делать запросы в местах, чтобы увидеть, были ли изменены какие-либо пункты меню, и если это необходимо для повторной загрузки и сортировки меню.

До сих пор в моем тестировании приложение, похоже, помнит, что информация в массиве прекрасна в течение всего дня с обычным несвязанным использованием телефона, но для этого должны быть некоторые ограничения?

Ответ 1

Ваше пространство памяти приложения останется в силе, пока ваше приложение будет запущено. Система не собирается произвольно освобождать память из-под вас. Как ваше приложение может функционировать так? Тип и атрибуты свойства абсолютно не имеют отношения к этому уровню.

Предупреждение о низком уровне памяти из системы - это запрос, что вы вручную освобождаете память, которая вам не нужна. Память приложений будет либо полностью, как вы ее оставили, либо, перейдя на задний план, а затем завершите, пустой лист. Если у вас есть данные, необходимые для выживания вашей программы, вам необходимо сделать резерв, чтобы сохранить его на диске и прочитать его.

iOS имеет некоторые трюки для сохранения и восстановления состояния вашего приложения, но это все еще применимо только к завершенному приложению.