- 浏览: 141960 次
- 性别:
- 来自: 北京
文章分类
最新评论
[转]http://blog.csdn.net/yy4040/article/details/7291385
iPhone下每个app可用的内存是被限制的,如果一个app使用的内存超过20M,则系统会向该app发送Memory Warning消息。收到此消息后,app必须正确处理,否则可能出错或者出现内存泄露。
app收到Memory Warning后会调用:
UIApplication::didReceiveMemoryWarning ->UIApplicationDelegate::applicationDidReceiveMemoryWarning,
然后调用当前所有的 viewController进行处理。因此处理的主要工作是在viewController。
我们知道,创建viewcontroller时,执行顺序是loadview -> viewDidLoad。
当收到内存警告时,如果viewcontroller未显示(在后台),会执行didReceiveMemoryWarning -> viewDidUnLoad;如果viewcontroller当前正在显示(在前台),则只执行didReceiveMemoryWarning。
当重新显示该viewController时,执行过viewDidUnLoad的viewcontroller(即原来在后台)会重新调用loadview -> viewDidLoad。
一、loadView
永远不要主动调用这个函数。view controller会在view的property被请求并且当前view值为nil时调用这个函数。如果你手动创建view,你应该重载这个函数。如果你用IB创建view并初始化view controller,那就意味着你使用initWithNibName:bundle:方法,这时,你不应该重载loadView函数。
这个方法的默认实现是这样:先寻找有关可用的nib文件的信息,根据这个信息来加载nib文件,如果没有有关nib文件的信息,默认实现会创建一个空白的UIView对象,然后让这个对象成为controller的主view。
所以,重载这个函数时,你也应该这么做。并把子类的view赋给view属性(property)(你create的view必须是唯一的实例,并且不被其他任何controller共享),而且你重载的这个函数不应该调用super。
如果你要进行进一步初始化你的views,你应该在viewDidLoad函数中去做。在iOS 3.0以及更高版本中,你应该重载viewDidUnload函数来释放任何对view的引用或者它里面的内容(子view等等)。
这个网上的资料都说的很不全面,尤其是蓝色字部分。
二、viewDidLoad
这个函数在controller加载了相关的views后被调用,而不论这些views存储在nib文件里还是在loadView函数中生成。而多数情况下是做nib文件的后续工作。
网上资料对这个函数的描述则完全不对。
三、viewDidUnload
这个函数是viewDidLoad的对立函数。在程序内存欠缺时,这个函数被controller调用()。由于controller通常保存着与view(这里黑体的view指controller的view属性)相关的对象(一般是view的子view)或者其他运行时创建的对象的引用,所以你必须使用这个函数来放弃这些对象的所有权以便内存回收。但不要释放那些难以重建的数据(不要在这个函数中释放view)。
通常controller会保存nib文件建立的views的引用,但是也可能会保存着loadView函数创建的对象的引用。最完美的方法是使用合成器方法:
self.myCertainView = nil;
这样合成器会release这个view,如果你没有使用property,那么你得自己显式释放这个view。
网上对这个函数的描述含含糊糊,看了等于没看。
另外:如果controller存储了其他object和view的引用,你还得在dealloc方法中释放这些内存。对于iOS2.x,你还必须在调用super dealloc方法前将这些引用置为nil。
四、结论
所以流程应该是这样:
(loadView/nib文件)来加载view到内存 ——>viewDidLoad函数进一步初始化这些view ——>内存不足时,调用viewDidUnload函数释放views
—->当需要使用view时有回到第一步
viewWillAppear: 方法
Called when the view is about to made visible. Default does nothing
视图即将可见时调用。默认情况下不执行任何操作
viewDidAppear:
Called when the view has been fully transitioned onto the screen. Default does nothing
视图已完全过渡到屏幕上时调用
viewWillDisappear:
Called when the view is dismissed, covered or otherwise hidden. Default does nothing
视图被驳回时调用,覆盖或以其他方式隐藏。默认情况下不执行任何操作
viewDidDisappear:
Called after the view was dismissed, covered or otherwise hidden. Default does nothing
视图被驳回后调用,覆盖或以其他方式隐藏。默认情况下不执行任何操作
iPhone下每个app可用的内存是被限制的,如果一个app使用的内存超过20M,则系统会向该app发送Memory Warning消息。收到此消息后,app必须正确处理,否则可能出错或者出现内存泄露。
app收到Memory Warning后会调用:
UIApplication::didReceiveMemoryWarning ->UIApplicationDelegate::applicationDidReceiveMemoryWarning,
然后调用当前所有的 viewController进行处理。因此处理的主要工作是在viewController。
我们知道,创建viewcontroller时,执行顺序是loadview -> viewDidLoad。
当收到内存警告时,如果viewcontroller未显示(在后台),会执行didReceiveMemoryWarning -> viewDidUnLoad;如果viewcontroller当前正在显示(在前台),则只执行didReceiveMemoryWarning。
当重新显示该viewController时,执行过viewDidUnLoad的viewcontroller(即原来在后台)会重新调用loadview -> viewDidLoad。
一、loadView
永远不要主动调用这个函数。view controller会在view的property被请求并且当前view值为nil时调用这个函数。如果你手动创建view,你应该重载这个函数。如果你用IB创建view并初始化view controller,那就意味着你使用initWithNibName:bundle:方法,这时,你不应该重载loadView函数。
这个方法的默认实现是这样:先寻找有关可用的nib文件的信息,根据这个信息来加载nib文件,如果没有有关nib文件的信息,默认实现会创建一个空白的UIView对象,然后让这个对象成为controller的主view。
所以,重载这个函数时,你也应该这么做。并把子类的view赋给view属性(property)(你create的view必须是唯一的实例,并且不被其他任何controller共享),而且你重载的这个函数不应该调用super。
如果你要进行进一步初始化你的views,你应该在viewDidLoad函数中去做。在iOS 3.0以及更高版本中,你应该重载viewDidUnload函数来释放任何对view的引用或者它里面的内容(子view等等)。
这个网上的资料都说的很不全面,尤其是蓝色字部分。
二、viewDidLoad
这个函数在controller加载了相关的views后被调用,而不论这些views存储在nib文件里还是在loadView函数中生成。而多数情况下是做nib文件的后续工作。
网上资料对这个函数的描述则完全不对。
三、viewDidUnload
这个函数是viewDidLoad的对立函数。在程序内存欠缺时,这个函数被controller调用()。由于controller通常保存着与view(这里黑体的view指controller的view属性)相关的对象(一般是view的子view)或者其他运行时创建的对象的引用,所以你必须使用这个函数来放弃这些对象的所有权以便内存回收。但不要释放那些难以重建的数据(不要在这个函数中释放view)。
通常controller会保存nib文件建立的views的引用,但是也可能会保存着loadView函数创建的对象的引用。最完美的方法是使用合成器方法:
self.myCertainView = nil;
这样合成器会release这个view,如果你没有使用property,那么你得自己显式释放这个view。
网上对这个函数的描述含含糊糊,看了等于没看。
另外:如果controller存储了其他object和view的引用,你还得在dealloc方法中释放这些内存。对于iOS2.x,你还必须在调用super dealloc方法前将这些引用置为nil。
四、结论
所以流程应该是这样:
(loadView/nib文件)来加载view到内存 ——>viewDidLoad函数进一步初始化这些view ——>内存不足时,调用viewDidUnload函数释放views
—->当需要使用view时有回到第一步
viewWillAppear: 方法
Called when the view is about to made visible. Default does nothing
视图即将可见时调用。默认情况下不执行任何操作
viewDidAppear:
Called when the view has been fully transitioned onto the screen. Default does nothing
视图已完全过渡到屏幕上时调用
viewWillDisappear:
Called when the view is dismissed, covered or otherwise hidden. Default does nothing
视图被驳回时调用,覆盖或以其他方式隐藏。默认情况下不执行任何操作
viewDidDisappear:
Called after the view was dismissed, covered or otherwise hidden. Default does nothing
视图被驳回后调用,覆盖或以其他方式隐藏。默认情况下不执行任何操作
发表评论
-
Foundation和UIKit框架组织图
2013-01-28 08:58 6185... -
[转]linux常用命令
2013-01-26 22:33 893本文来自于http://blog.csdn.net/totog ... -
[转] NSString 控件消息
2013-01-19 15:52 1061【转】http://www.tongwenguan.com/o ... -
关闭arc
2013-01-17 22:35 04.2前的xcode中,打开“Build Setting”,找 ... -
地址薄源码分析
2013-01-17 10:13 1640ContactViewController.h 头文件 #im ... -
iOS main函数 机器码
2013-01-17 07:24 2498main 启动对应机器码分析 0x2730: pushl ... -
歌曲源码剪切分析
2013-01-16 17:19 7579mian.m 以及appdelegate就不说了,主要说说C控 ... -
[转]深入理解Objective-c中@class的含义
2013-01-16 07:16 1040[转]http://blog.prosight.me/i ... -
UIImageView【转】
2013-01-16 07:17 5464【转】http://my.oschina.net/plumso ... -
isKindOfClass<> isMemberOfClass[转]
2013-01-15 10:27 0转http://blog.csdn.net/totogo201 ... -
NSString 截取,文件读取【转】
2013-01-16 07:18 1530【转】http://www.cnblogs.com/csj00 ... -
loadNibNamed
2013-01-15 10:05 0动态加载,就是在程序运行当中,根据需要动态地加载一些视图,常常 ... -
respondsToSelector
2013-01-15 09:31 2514respondsToSelector该方法询问对象以确定其是否 ... -
initWithFrame<>initWithCoder
2013-01-15 09:19 1765initWithFrame 和 initWithCode ... -
协议protocol
2013-01-16 07:17 1087自定义协议语法如下: @protocol 协议名称 方法之声明 ... -
addSubview<>insertSubView
2013-01-15 08:35 3561addSubview是一层一层往上加,新加的只能放到父视图的最 ... -
UIViewController生命周期[转]
2013-01-15 00:09 974转http://www.cnblogs.com/smileEv ... -
IBOutlet IBaction 详解
2013-01-14 23:33 4372IBOutlet对于编译器而言只是一个标记,也就是 ... -
AppDelegate.m 介绍
2013-01-14 22:59 6618【转】[url] www.cnblogs.com/xunzi ... -
OC-plist xib pch StoryBoard
2013-01-14 21:12 1231plist plist文件是什么呢? 它全名是: ...
相关推荐
视图控制器在收到该通知的同时还会收到 didReceiveMemoryWarning 消息,并且应用的 AppDelegate 也会收到 applicationDidReceiveMemoryWarning: 消息。 在开发过程中,为了测试应用能否对 iOS 系统的内存警告通知...
import UIKit import QuartzCore import SceneKit ... override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Release any cached data, images, etc that aren't in use. } }
当应用程序收到内存警告时,系统会调用`UIViewController`的`didReceiveMemoryWarning`方法。默认情况下,此方法会检查控制器是否可以安全地释放其视图(view),例如,如果视图没有父视图并且可以被轻松重建(如...
在`memoryManagement`方面,我们需要注意在`didReceiveMemoryWarning`和`dealloc`方法中释放不再使用的资源。当视图没有父视图时,`didReceiveMemoryWarning`会被调用来释放缓存数据。而在`dealloc`方法中,调用`...
8. **内存警告和应用挂起**:除了`didReceiveMemoryWarning`,当接收到全局的内存警告时,所有视图控制器都应检查并释放资源。同时,应用挂起时(如进入后台),视图控制器需要保存状态以便恢复。 总的来说,iOS多...
9. **内存警告和 didReceiveMemoryWarning**:了解设备内存紧张时,系统如何触发内存警告,以及如何响应`didReceiveMemoryWarning`方法,对应用的健壮性至关重要。 通过学习和实践这些知识点,开发者可以编写出高效...
10. `didReceiveMemoryWarning`:当应用收到内存警告时调用,可以在此释放非必需资源以减轻内存压力。 11. `dealloc`:当UIViewController实例被释放时调用,用于清理资源并释放内存。 在实际开发中,我们需要根据...
接着,实现 `-viewDidLoad` 和 `-didReceiveMemoryWarning` 方法,这两个方法是 UIViewController 的生命周期方法,用于初始化视图和管理内存。 接下来,我们将关注 UIAlertController 的两种基本样式:...
当系统内存紧张时,`didReceiveMemoryWarning`会被调用,提示视图控制器释放可释放的资源。默认操作是释放可以被重新创建的非内存关键资源。 9. 预处理指令`#define`声明常量: `#define YEAR_SEC (365*24*3600)`...
- `didReceiveMemoryWarning`在程序收到内存警告时调用,系统建议在此方法中释放非必需资源。默认情况下,它会检查是否可以安全地释放controller的view,如果该view没有父视图且可以方便重建,则会释放。 4. **...
7. **内存警告与 didReceiveMemoryWarning**:iOS设备内存有限,当系统内存不足时,会发送`UIApplicationDidReceiveMemoryWarningNotification`通知。这时,应用应该释放非必要的资源,减少内存占用。 8. **...
- `didReceiveMemoryWarning`方法会在系统警告视图控制器内存不足时调用,需在此清理非必需资源。 - `deinit`方法是视图控制器销毁前的最后一步,表明视图控制器将不再使用。 通过分析这个无动画版本的源码,...
19. `didReceiveMemoryWarning`在系统认为内存不足时调用,默认操作是释放可复用的非关键资源,自定义时,需要考虑哪些资源可以在不影响功能的前提下释放。 这些知识点涵盖了Objective-C内存管理、对象生命周期、...
虽然它不能直接给出剩余内存的数值,但可以通过监听`didReceiveMemoryWarning`通知来监控内存警告。当系统内存不足时,会发送这个通知给所有应用。另外,`NSProcessInfo`的`physicalMemory`属性可以获取到设备的物理...
具体到编程技术点,面试者应该了解ViewController的内存警告处理方式,即调用super的`didReceiveMemoryWarning`方法。对于事件的处理,应该理解什么时候使用delegation(代理模式)和什么时候使用Notification(通知...
9. **UIViewController 的 didReceiveMemoryWarning 方法在系统资源紧张时会调用**。 - 当系统检测到内存较低时,会调用此方法通知视图控制器释放不必要的资源。 10. **MVC 模型中,M 是指 Model(模型),V 是指 ...
至于内存信息,可以监听`UIApplication.didReceiveMemoryWarning`通知来获取内存警告。 除了`UIDevice`,还可以通过其他方式获取更详细的硬件信息。例如,利用私有API(需注意App Store审核规则)或第三方库,可以...
通常在`deinit`方法中注销,或者在视图控制器的`viewWillDisappear`或`didReceiveMemoryWarning`等适当时机注销。 - **避免泄漏**:使用`removeObserver`方法时需提供正确的observer和name,确保正确移除。避免在类...
生命周期方法包括初始化(init)、销毁(dealloc)、视图加载(viewDidLoad)、视图出现(viewWillAppear)和内存警告处理(didReceiveMemoryWarning)。通过合理的组织,代码的可维护性和可读性得到提升。 2. 代码...
再者,`didReceiveMemoryWarning`方法在iOS 5.0中也得到了增强。当设备内存紧张时,系统会通知视图控制器释放可选的内存。开发者可以在此方法中进行适当的资源清理,以应对低内存警告。虽然这个方法在早期版本中就...