关于C#:iOS(非原子,强)属性的生命周期如何?

How does a (nonatomic, strong) property's lifespan work in iOS?

假设我有一个属性声明为:@property (nonatomic, strong) NSArray *menuArr;@property (strong) NSArray *menuArr;,并将该属性设置为viewDidLoad。设备将"记住"存储在阵列中的信息多长时间?

属性声明并设置在嵌入到NavigationViewController中的ViewController中,后者本身就是TabbarViewController中的第一个视图控制器。换句话说,它是用户看到的第一个视图,然后他们可以离开它并返回。

在没有就原子与非原子进行辩论的情况下,我的问题是

某个属性(无论以哪种方式声明)在iOS环境中是否无限地存在,或者其寿命是否受时间、其他地方的内存使用、关闭设备等因素的限制?

为了避免这是一个"X Y问题",下面是我问的原因:

我正在开发一个应用程序,它包含一个被分成多个类别的菜单,每个类别中有几个项目……正如你所期望的那样。所有菜单项都存储在parse.com上。首先,我在每个页面上做一个单独的pfquery,一个在categories页面上获取类别,当用户选择一个类别时,一个新页面被推送,第二个pfquery获取所选类别中的所有项目。这是可行的,但页面加载需要很长时间,有时可能需要10-15秒,但没有真正的迹象表明应用程序还没有冻结。

为了解决这个问题,我决定在viewDidLoad中加载应用程序的第一个视图时运行一个pfquery,获取所有菜单项并将自己排序为包含项的嵌套类别数组。然后,我将菜单数组存储在ViewController上的一个属性中。稍后,当我进入菜单时,我看到下面的菜单是viewDidLoad

1
2
3
4
5
6
//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确实有一些技巧可以保留和恢复应用程序的状态,但这仍然只适用于终止的应用程序。