假设我有一个属性声明为:@property (nonatomic, Strong) NSArray *menuArr;
OR @property (strong) NSArray *menuArr;
并在 viewDidLoad
中设置此属性。设备会“记住”我存储在数组中的信息多久?
该属性在嵌入在 navigationViewController 中的 viewController 中声明和设置,而 navigationViewController 本身就是 TabBarViewController 中的第一个 View Controller 。换句话说,这是用户看到的第一个 View ,然后他们可能会离开该 View 并返回。
在不讨论原子与非原子的情况下,我的问题是这样的
属性(以任何方式声明)是否在 iOS 环境中无限存在,或者其生命周期受到时间、其他地方的内存使用情况、关闭设备等因素的限制
为了避免出现“x y 问题”,我问的原因如下:
我正在开发一个应用程序,其中包含一个分为多个类别的菜单,每个类别中有多个项目......正如您所期望的菜单一样。所有菜单项都存储在 parse.com 上。首先,我在每个页面上执行一个单独的 PFQuery,在类别页面上执行一个以获取类别,当用户选择一个类别时,将推送一个新页面,第二个 PFQuery 获取所选类别中的所有项目。这可行,但页面需要相当长的时间才能加载,有时可能需要 10-15 秒,并且没有真正的迹象表明应用程序并没有卡住。
为了解决这个问题,我决定在 viewDidLoad
中加载应用程序的第一个 View 时运行一个 PFQuery,获取所有菜单项并将自己排序到包含项目的类别的嵌套数组中。然后,我将菜单数组存储在 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's `menuArr` property to point to the menuArr on the first viewController.
_menuArr=myVC1ref.menuArr;
我的理解是,这创建了一个指向原始数组的指针,并且实际上并没有创建第二个数组(如果我错了,请纠正我)。
此方法一次需要大约 10-15 秒来加载和排序数组,但之后页面之间的导航是即时的,这要好得多。
我计划在一些地方进行查询,看看是否有任何菜单项已更改,如果是,则重新下载菜单并对其进行排序。
到目前为止,在我的测试中,应用程序似乎全天都能很好地记住数组中的信息,并且正常使用不相关的手机,但这必须有一些限制,对吗?
最佳答案
只要您的应用正在运行,您的应用的内存空间就会保持有效。系统不会随意释放你的内存。你的应用程序怎么可能有这样的功能?属性的类型和属性在此级别绝对没有相关性。
系统发出的内存不足警告是请求您手动释放不需要的内存。应用程序的内存要么完全与您离开时一样,要么在移动到后台然后终止后变成一张空白的石板。如果您的数据需要在程序退出后继续存在,则需要采取措施将其保存到磁盘并读回。
iOS does have some tricks to preserve and restore your app's state ,但这仍然只适用于已终止的应用程序。
关于ios - (非原子、强)属性的生命周期在 iOS 中如何运作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23977765/