`
fantom
  • 浏览: 141960 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

didReceiveMemoryWarning

 
阅读更多
[转]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
视图被驳回后调用,覆盖或以其他方式隐藏。默认情况下不执行任何操作
  • 大小: 60 KB
分享到:
评论

相关推荐

    iOS调试工具AllYourMemoriesAreBelong2iOS.zip

    视图控制器在收到该通知的同时还会收到 didReceiveMemoryWarning 消息,并且应用的 AppDelegate 也会收到 applicationDidReceiveMemoryWarning: 消息。 在开发过程中,为了测试应用能否对 iOS 系统的内存警告通知...

    3D动画 iOS

    import UIKit import QuartzCore import SceneKit ... override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Release any cached data, images, etc that aren't in use. } }

    iOS面试题-总览

    当应用程序收到内存警告时,系统会调用`UIViewController`的`didReceiveMemoryWarning`方法。默认情况下,此方法会检查控制器是否可以安全地释放其视图(view),例如,如果视图没有父视图并且可以被轻松重建(如...

    iphone程序设计

    在`memoryManagement`方面,我们需要注意在`didReceiveMemoryWarning`和`dealloc`方法中释放不再使用的资源。当视图没有父视图时,`didReceiveMemoryWarning`会被调用来释放缓存数据。而在`dealloc`方法中,调用`...

    ios 多视图切换

    8. **内存警告和应用挂起**:除了`didReceiveMemoryWarning`,当接收到全局的内存警告时,所有视图控制器都应检查并释放资源。同时,应用挂起时(如进入后台),视图控制器需要保存状态以便恢复。 总的来说,iOS多...

    内存管理资料.zip

    9. **内存警告和 didReceiveMemoryWarning**:了解设备内存紧张时,系统如何触发内存警告,以及如何响应`didReceiveMemoryWarning`方法,对应用的健壮性至关重要。 通过学习和实践这些知识点,开发者可以编写出高效...

    iOS App开发中UIViewController类的使用教程

    10. `didReceiveMemoryWarning`:当应用收到内存警告时调用,可以在此释放非必需资源以减轻内存压力。 11. `dealloc`:当UIViewController实例被释放时调用,用于清理资源并释放内存。 在实际开发中,我们需要根据...

    AlertController的代码实现.pdf

    接着,实现 `-viewDidLoad` 和 `-didReceiveMemoryWarning` 方法,这两个方法是 UIViewController 的生命周期方法,用于初始化视图和管理内存。 接下来,我们将关注 UIAlertController 的两种基本样式:...

    远泓科技笔试题(obj_c)

    当系统内存紧张时,`didReceiveMemoryWarning`会被调用,提示视图控制器释放可释放的资源。默认操作是释放可以被重新创建的非内存关键资源。 9. 预处理指令`#define`声明常量: `#define YEAR_SEC (365*24*3600)`...

    百度笔试题整理

    - `didReceiveMemoryWarning`在程序收到内存警告时调用,系统建议在此方法中释放非必需资源。默认情况下,它会检查是否可以安全地释放controller的view,如果该view没有父视图且可以方便重建,则会释放。 4. **...

    IOS应用源码——RetainCount.rar

    7. **内存警告与 didReceiveMemoryWarning**:iOS设备内存有限,当系统内存不足时,会发送`UIApplicationDidReceiveMemoryWarningNotification`通知。这时,应用应该释放非必要的资源,减少内存占用。 8. **...

    IOS应用源码——视图控制器(无动画版).rar

    - `didReceiveMemoryWarning`方法会在系统警告视图控制器内存不足时调用,需在此清理非必需资源。 - `deinit`方法是视图控制器销毁前的最后一步,表明视图控制器将不再使用。 通过分析这个无动画版本的源码,...

    iPhone开发、ObjectiveC_面试题目

    19. `didReceiveMemoryWarning`在系统认为内存不足时调用,默认操作是释放可复用的非关键资源,自定义时,需要考虑哪些资源可以在不影响功能的前提下释放。 这些知识点涵盖了Objective-C内存管理、对象生命周期、...

    获取设备内存大小和剩余内存大小

    虽然它不能直接给出剩余内存的数值,但可以通过监听`didReceiveMemoryWarning`通知来监控内存警告。当系统内存不足时,会发送这个通知给所有应用。另外,`NSProcessInfo`的`physicalMemory`属性可以获取到设备的物理...

    ios经典面试题汇总

    具体到编程技术点,面试者应该了解ViewController的内存警告处理方式,即调用super的`didReceiveMemoryWarning`方法。对于事件的处理,应该理解什么时候使用delegation(代理模式)和什么时候使用Notification(通知...

    iOS笔试题.doc

    9. **UIViewController 的 didReceiveMemoryWarning 方法在系统资源紧张时会调用**。 - 当系统检测到内存较低时,会调用此方法通知视图控制器释放不必要的资源。 10. **MVC 模型中,M 是指 Model(模型),V 是指 ...

    获取iphone设备的硬件信息

    至于内存信息,可以监听`UIApplication.didReceiveMemoryWarning`通知来获取内存警告。 除了`UIDevice`,还可以通过其他方式获取更详细的硬件信息。例如,利用私有API(需注意App Store审核规则)或第三方库,可以...

    ios-定时器自动释放和观察者自动注销.zip

    通常在`deinit`方法中注销,或者在视图控制器的`viewWillDisappear`或`didReceiveMemoryWarning`等适当时机注销。 - **避免泄漏**:使用`removeObserver`方法时需提供正确的observer和name,确保正确移除。避免在类...

    iOS Objective C编码规范

    生命周期方法包括初始化(init)、销毁(dealloc)、视图加载(viewDidLoad)、视图出现(viewWillAppear)和内存警告处理(didReceiveMemoryWarning)。通过合理的组织,代码的可维护性和可读性得到提升。 2. 代码...

    UIViewcontoller的新方法测试_demo

    再者,`didReceiveMemoryWarning`方法在iOS 5.0中也得到了增强。当设备内存紧张时,系统会通知视图控制器释放可选的内存。开发者可以在此方法中进行适当的资源清理,以应对低内存警告。虽然这个方法在早期版本中就...

Global site tag (gtag.js) - Google Analytics