iOS的版本号已经到了6.0.1了,
这篇文章说60%的iPhone用户已经升级到了iOS6了。那我们的应用有没有做好相关的准备工作呢。
1.我们的工程是ARC的。
2.我们会在viewController里面持有大量子view的成员变量(strong)
3.我们实现了大量的viewDidUnload函数来释放 (2)里面持有的那个子view。
1 - (void)didReceiveMemoryWarning
2 {
3 [super didReceiveMemoryWarning];
4 // Add code to clean up any of your own resources that are no longer necessary.
5 if ([self.view window] == nil)
6 {
7 // Add code to preserve data stored in the views that might be
8 // needed later.
9 // Add code to clean up other strong references to the view in
10 // the view hierarchy.
11 self.view = nil;
12 }
A对象:因为它已经不在当前UI显示了,所以满足[self.view window] == nil,相关view被释放。
B对象:正在显示,所有didReceiveMemoryWarning什么也不会干。
C对象:最悲惨,从来没有显示过,viewDidload从来没调用过,也没有显示过。然后有个self.view .这句的调用会导致一个结果,就是C对象的viewDidload会被调用一次,于是他的逻辑就是释放前先创建一次,然后再把自己释放,是不是很悲剧。(所以apple给的方案也不一定完美靠谱)
到这里故事也讲了,最后说说,在iOS6 及其以后,我们应该怎么处理这个问题。
1.不要把 subView 当成成员变量来持有。使用tag来操作。(其实不管在哪个版本最后都这么做)
2.不需要实现viewDidUnload,由系统自己来控制相关的内存释放
3.在需要的时候实现didReceiveMemoryWarning来释放一些业务数据减少内存的占用,不要操作UIView。