关于OC的内存管理
2015-08-03 12:37
309 查看
1 什么是内存管理?
内存管理是关于如何管理对象生命周期的编程原则。
OC中的内存管理只针对OC中的对象,所有的对象都继承NSObject
基本数据类型不需要管理内存。
当一个对象没有人再使用,该对象应该从内存中销毁掉。
2 引用计数
所有的OC对象都有一个计数器,这个计数器我们成为引用计数。
引用计数表示有几个人在使用当前对象。
alloc用来创建对象,创建完成后,引用计数为1,只调用一次。
retain使引用计数+1,可以多次调用。
release使引用计数-1,可以调用多次。
当引用计数为0时,对象会被系统从内存中销毁,销毁之前,会自动调用此对象的dealloc方法
3对象所有权
当一个所有者(owner,本身是一个OC对象)做了如下动作,它就拥有了一个对象的所有权(ownership)。
alloc retain copy
使用如下方法,释放对象所有权
release autorelease
4黄金法则
如果一个对象使用了alloc,[nutable]copy retain,那么你必须使用相应的release或者autorelease释放。
5 dealloc 方法
当对象的引用计数为0时,系统调用此对象的dealloc方法
我们应该在dealloc方法中,释放他持有的对象。
调用[super dealloc]是为了释放父类持有的对象所有权。
6 @property可以为一个属性自动生成set和get方法,不需要我们手动编写。
@property(nonatomic,retain,rewrite)NSString *userName;
一 原子性 atomic 多线程环境下,存在线程保护,默认
nonatomic:多线程环境下,不存在线程保护
二 赋值 assign:直接赋值,默认
retain:保留对象
copy:拷贝对象
三读写性:readwrite:生成setter,getter方法,默认
readonly :只生成getter方法
我们也可以重新实现set和get方法,优先调用自己实现的set和get方法。
7 自动释放池
自动释放池是OC的一种内存自动管理机制,
当自动释放池销毁时,它会对池子中的每一个对象调用一次release方法。
当我们向一个对象发送autorelease消息时,这个对象就被放入了自动释放池。
当自动释放池销毁时,会对池中的每个对象发送一条release消息,以此释放它们。
自动释放池可以嵌套使用。
autorelease会将对象添加到离它最近的自动释放池。
8
类方法创建的内存管理
foundation中的类可以通过alloc创建和类方法创建,区别在于内存管理不一样。
类方法创建的对象是加入了自动释放池。
新语法创建的对象和类方法创建的对象相同,由自动释放池管理。
将对象添加到数组或者字典,会执行一次retain,数组或者字典销毁,会给每一个元素发送release消息。
9 ARC
ARC自动引用计数(automatic reference counting),提供自动管理内存的功能。
特点: 不需要手动管理引用计数,不需要也不允许retain,r elease,autorelease
注意:版本的支持是在IOS4(不支持弱引用),IOS5上。
10 循环引用
对象A retain 对象B,同时对象B retain 对象 A,这种情况我们称之为循环引用。
循环引用会导致两个对象都无法销毁。
总结:黄金法则
如果一个对象使用了alloc,copy[mutable],retain,那么你就有义务向这个对象发送一条release或者autorelease消息。
遇到的问题:
关于字典和数组,我们都放在自动释放池中,因为字典和数组都是类方法创建的对象,类方法创建的内存管理,放入自动释放池,由自动释放池管理。
内存管理是关于如何管理对象生命周期的编程原则。
OC中的内存管理只针对OC中的对象,所有的对象都继承NSObject
基本数据类型不需要管理内存。
当一个对象没有人再使用,该对象应该从内存中销毁掉。
2 引用计数
所有的OC对象都有一个计数器,这个计数器我们成为引用计数。
引用计数表示有几个人在使用当前对象。
alloc用来创建对象,创建完成后,引用计数为1,只调用一次。
retain使引用计数+1,可以多次调用。
release使引用计数-1,可以调用多次。
当引用计数为0时,对象会被系统从内存中销毁,销毁之前,会自动调用此对象的dealloc方法
3对象所有权
当一个所有者(owner,本身是一个OC对象)做了如下动作,它就拥有了一个对象的所有权(ownership)。
alloc retain copy
使用如下方法,释放对象所有权
release autorelease
4黄金法则
如果一个对象使用了alloc,[nutable]copy retain,那么你必须使用相应的release或者autorelease释放。
5 dealloc 方法
当对象的引用计数为0时,系统调用此对象的dealloc方法
我们应该在dealloc方法中,释放他持有的对象。
调用[super dealloc]是为了释放父类持有的对象所有权。
6 @property可以为一个属性自动生成set和get方法,不需要我们手动编写。
@property(nonatomic,retain,rewrite)NSString *userName;
一 原子性 atomic 多线程环境下,存在线程保护,默认
nonatomic:多线程环境下,不存在线程保护
二 赋值 assign:直接赋值,默认
retain:保留对象
copy:拷贝对象
三读写性:readwrite:生成setter,getter方法,默认
readonly :只生成getter方法
我们也可以重新实现set和get方法,优先调用自己实现的set和get方法。
7 自动释放池
自动释放池是OC的一种内存自动管理机制,
当自动释放池销毁时,它会对池子中的每一个对象调用一次release方法。
当我们向一个对象发送autorelease消息时,这个对象就被放入了自动释放池。
当自动释放池销毁时,会对池中的每个对象发送一条release消息,以此释放它们。
自动释放池可以嵌套使用。
autorelease会将对象添加到离它最近的自动释放池。
8
类方法创建的内存管理
foundation中的类可以通过alloc创建和类方法创建,区别在于内存管理不一样。
类方法创建的对象是加入了自动释放池。
新语法创建的对象和类方法创建的对象相同,由自动释放池管理。
将对象添加到数组或者字典,会执行一次retain,数组或者字典销毁,会给每一个元素发送release消息。
9 ARC
ARC自动引用计数(automatic reference counting),提供自动管理内存的功能。
特点: 不需要手动管理引用计数,不需要也不允许retain,r elease,autorelease
注意:版本的支持是在IOS4(不支持弱引用),IOS5上。
10 循环引用
对象A retain 对象B,同时对象B retain 对象 A,这种情况我们称之为循环引用。
循环引用会导致两个对象都无法销毁。
总结:黄金法则
如果一个对象使用了alloc,copy[mutable],retain,那么你就有义务向这个对象发送一条release或者autorelease消息。
遇到的问题:
关于字典和数组,我们都放在自动释放池中,因为字典和数组都是类方法创建的对象,类方法创建的内存管理,放入自动释放池,由自动释放池管理。
相关文章推荐
- html-markdown
- COJ969 WZJ的数据结构(负三十一)
- tomcat的work目录
- 多谐震荡电路
- hkpDynamics->hkpMotion
- [深入理解Android卷二 全文-第六章]深入理解ActivityManagerService
- Java基础加强之反射
- Linux mkdir、tar 和 kill 命令的 4 个有用小技巧
- 字符数组,字符指针,sizeof,strlen总结
- SQL Server 2008 体系结构
- javascript自定义in_array()函数实现方法
- 1098. Insertion or Heap Sort (25)
- hkpDynamics->hkpRigidBodyCinfo
- 微信开发总结 二
- c++中“计时器”、“sort”、“namespace”函数的用法
- Qt5.5 连接Access2007数据库
- 事件查看器ID 1041
- 支持ajax的爬虫
- web前端工具(配色图片图标)
- oracle中多行增删改