iOS内存管理小总结
2015-07-14 16:35
267 查看
1、引用计数机制通过可以递增递减的计数器来管理 内存。对象创建好之后,其保留计数至少为1。若保留计数为正,则对象继续存活。当保留计数降为0时,对象就被销毁了
2、在对象生命周期中,其余对象通过引用来保留或者释放此对象。保留与释放操作分别会递增及递减保留计数
3、使用ARC一定要记住,引用计数实际上还是要执行的,只不过保留与释放操作现在是由ARC自动为你添加。实际上,ARC在调用retain、release、autorelease、dealloc这些方法时,并不通过普通的Objective-C消息派发机制,而是直接调用底层C语言版本。这样做性能更好,因为保留及释放操作需要频繁执行,所以直接调用底层函数能节省很多CPU周期。比方说,ARC会调用与retain等价的底层函数objc_retain。这也是不能覆写retain、release、或autorelease的缘由,因为这些方法从来不会被直接调用。
4、使用ARC时必须遵循的方法名命名规则,若方法名以下列词语开头,则返回的对象归调用者所有:alloc、new、copy、mutableCopy。归调用者所有的意思是:调用上述四种方法的那段代码要负责释放方法所返回的对象
5、ARC也会处理局部变量与实力变量的内存管理,可以用以下修饰符来改变局部变量与实例变量的语义
__strong:默认语义,保留辞职。
__unsafe_unretained:不保留此值,这么做可能不安全,因为等到再次使用变量时,其对象可能已经回收了。
__weak:不保留此值,但是变量可以安全使用,因为如果系统把这个对象回收了,那么变量也会自动清空
__autoreleasing:把对象“按引用传递”给方法时,使用这个特殊的修饰符。此值在方法返回时自动释放
6、ARC总结:有了ARC之后,程序员就无须担心内存管理的问题了,使用ARC来编程,可省去类中的许多“样板代码”。ARC管理对象生命期的方法基本是:在合适的地方插入“保留”及“释放”操作,在ARC环境下,变量的内存管理语义可以通过修饰符指明,而原本则需要手工执行“保留”及“释放”操作。ARC只是负责管理Ojective-C对象的内存,尤其要注意:CoreFoundation对象不归ARC管理,开发者必须适时调用CFRetain/CFRelease
7、dealloc方法的调用:在 dealloc 方法中,应该做的事情就是释放指向其他对象的引用,并取消原来订阅的“键值观察(KVC)”或NSNotificationCenter等通知,不要做其他事情。如果对象持有文件描述符等系统资源,那么应该专门编写一个方法来释放此种资源,这样的类要和其使用者约定:用完资源后必须调用close方法。执行异步任务的方法不应在dealloc里调用,只能在正常状态下执行的那些方法也不应在dealloc里调用,因为此时对象已处于正在回收的状态了
8、自动释放池排布在栈中,对象收到autorelease消息后,系统将其放入最顶端的池里。合理运用自动释放池,可降低应用程序的内存峰值。@autoreleasepool这种新式写法能创建出更为轻便的自动释放池
9、僵尸对象:系统在回收对象时,可以不将其真的回收,而是把它转化为僵尸对象,通过环境变量NSZombieEnabled可开启此功能。系统会修改对象的isa指针,令其指向特殊的僵尸类,从而使该对象变为僵尸对象,僵尸能够响应所有的选择子,响应方式为:打印一条包含消息内容及其接受者的消息,然后终止应用程序
2、在对象生命周期中,其余对象通过引用来保留或者释放此对象。保留与释放操作分别会递增及递减保留计数
3、使用ARC一定要记住,引用计数实际上还是要执行的,只不过保留与释放操作现在是由ARC自动为你添加。实际上,ARC在调用retain、release、autorelease、dealloc这些方法时,并不通过普通的Objective-C消息派发机制,而是直接调用底层C语言版本。这样做性能更好,因为保留及释放操作需要频繁执行,所以直接调用底层函数能节省很多CPU周期。比方说,ARC会调用与retain等价的底层函数objc_retain。这也是不能覆写retain、release、或autorelease的缘由,因为这些方法从来不会被直接调用。
4、使用ARC时必须遵循的方法名命名规则,若方法名以下列词语开头,则返回的对象归调用者所有:alloc、new、copy、mutableCopy。归调用者所有的意思是:调用上述四种方法的那段代码要负责释放方法所返回的对象
5、ARC也会处理局部变量与实力变量的内存管理,可以用以下修饰符来改变局部变量与实例变量的语义
__strong:默认语义,保留辞职。
__unsafe_unretained:不保留此值,这么做可能不安全,因为等到再次使用变量时,其对象可能已经回收了。
__weak:不保留此值,但是变量可以安全使用,因为如果系统把这个对象回收了,那么变量也会自动清空
__autoreleasing:把对象“按引用传递”给方法时,使用这个特殊的修饰符。此值在方法返回时自动释放
6、ARC总结:有了ARC之后,程序员就无须担心内存管理的问题了,使用ARC来编程,可省去类中的许多“样板代码”。ARC管理对象生命期的方法基本是:在合适的地方插入“保留”及“释放”操作,在ARC环境下,变量的内存管理语义可以通过修饰符指明,而原本则需要手工执行“保留”及“释放”操作。ARC只是负责管理Ojective-C对象的内存,尤其要注意:CoreFoundation对象不归ARC管理,开发者必须适时调用CFRetain/CFRelease
7、dealloc方法的调用:在 dealloc 方法中,应该做的事情就是释放指向其他对象的引用,并取消原来订阅的“键值观察(KVC)”或NSNotificationCenter等通知,不要做其他事情。如果对象持有文件描述符等系统资源,那么应该专门编写一个方法来释放此种资源,这样的类要和其使用者约定:用完资源后必须调用close方法。执行异步任务的方法不应在dealloc里调用,只能在正常状态下执行的那些方法也不应在dealloc里调用,因为此时对象已处于正在回收的状态了
8、自动释放池排布在栈中,对象收到autorelease消息后,系统将其放入最顶端的池里。合理运用自动释放池,可降低应用程序的内存峰值。@autoreleasepool这种新式写法能创建出更为轻便的自动释放池
9、僵尸对象:系统在回收对象时,可以不将其真的回收,而是把它转化为僵尸对象,通过环境变量NSZombieEnabled可开启此功能。系统会修改对象的isa指针,令其指向特殊的僵尸类,从而使该对象变为僵尸对象,僵尸能够响应所有的选择子,响应方式为:打印一条包含消息内容及其接受者的消息,然后终止应用程序
相关文章推荐
- Python动态类型的学习---引用的理解
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 【DevOps】为什么我们永远疲于奔命?
- 土人系列AS入门教程 -- 对象篇
- 网络管理之IP地址篇
- IE7降低内存和降低CPU的几个技巧
- 文件的读出 编辑 管理
- C#托管堆对象实例包含内容分析
- 如何高效的使用内存
- DOS下内存的配置
- Lua的内存管理浅析
- XP/win2003下发现1G的内存比512M还慢的解决方法
- javascript asp教程第十一课--Application 对象
- SQL Server 2008 R2 应用及多服务器管理