OC的内存管理--自动引入计数
来源:互联网 发布:http js.zy.com 编辑:程序博客网 时间:2024/05/21 03:25
OC内存管理的思想:
*自己生成的对象,自己持有
*非自己生成的对象,自己也能持有
*不再需要自己持有的对象时释放
*非自己持有的对象无法释放
对象操作与OC对应的方法:
这些有关OC内存管理的方法,实际上步包括在该语言中,而是包含在Cocoa框架中用于OS X,IOS应用开发。Cocoa框架中Foundation框架类库的NSObject类担负内存管理的职责。OC内存管理的alloc/retain/release/dealloc方法分别指代NSObject类的alloc类方法,retain实例方法,release实例方法和dealloc实例方法。
自己生成的对象,自己所持有
使用以下名称开头的方法名意味着自己生成的对象只有自己持有:
*alloc
*new
*copy
*mutableCopy
举例:
/*
*自己生成并持有对象
*/
id obj=[[NSObject alloc]init];
/*
*自己持有对象
*/
使用NSObject的alloc类方法就能自己生成并持有对象,指向生成并持有对象的指针被赋值给变量obj。另外,使用如下new类方法也能生成并持有对象。[NSObject new]与[[NSObject alloc]init]是完全一致的。
/*
*自己生成并持有对象
*/
id obj=[NSObject new];
/*
*自己持有对象
*/
copy方法利用基于NSCopying方法约定,由各类实现的copyWithZone:方法生成并持有对象的副本。与copy方法类似,mutableCopy方法利用基于NSMutableCopying方法约定,由各类实现的mutableCopyWithZone:方法生成并持有对象的副本。两者的区别在于,copy方法生成不可变更的对象,而mutableCopy方法生成可变更的对象。这类似于NSArray类对象与NSMutableArray类对象的差异。用这些方法生成的对象,虽然是对象的副本,但同alloc、new方法一样,在“自己生成并持有对象”这点上没有改变。
非自己生成的对象,自己也能持有
用上述项目之外的方法取得的对象,即用alloc/new/copy/mutableCopy以外的方法取得的对象,因为非自己生成并持有,所以自己不是该对象的持有者,我们来使用alloc/new/copy/mutableCopy以外的方法看看,这里试用一下NSMutableArray类的array类方法
/*
*取得非自己生成并持有的对象
*/
id obj= [NSMutableArray array];
/*
*取得的对象存在,但自己不持有对象
*/
源代码中,NSMutableArray类对象被赋值给变量obj,但变量obj自己并不持有该对象。使用retain方法可以持有对象
/*
*取得非自己生成并持有的对象
*/
id obj= [NSMutableArray array];
/*
*取得的对象存在,但自己不持有对象
*/
[obj retain];
/*
*自己持有对象
*/
通过retain方法,非自己生成的对象跟用alloc/new/copy/mutableCopy方法生成并持有的对象一样,成为了自己所持有的。
不再需要自己持有的对象时释放
自己持有的对象,一旦不再需要,持有者有义务释放该对象,释放使用release方法。
/*
*自己生成并持有对象
*/
id obj=[[NSObject alloc]inti];
/*
*自己持有对象
*/
[obj release];
/*
*释放对象
指向对象的指针仍然被保留在变量obj中,貌似能够访问,但对象一经释放绝对不可访问
*/
如此,用alloc方法由自己生成并持有的对象就通过release方法释放了,自己生成而非自己所持有的对象,若用retain方法变为自己持有,也同样可以用release方法释放。
/*
*取得非自己生成并持有的对象
*/
id obj=[NAMutableArray array];
/*
*取得的对象存在,但自己不持有对象
*/
[obj retain];
/*
*自己持有对象
*/
[obj release];
/*
*释放对象,对象不可再被访问
*/
用alloc/new/copy/mutableCopy方法生成并持有的对象,或者用retain方法持有的对象,一旦不再需要,务必要用release方法进行释放。
如果要用某个方法生成对象,并将其返还该方法的调用方,那么它的源代码又是怎样的呢?
-(id)allocObject
{
/*
*自己生成并持有对象
*/
id obj=[[NSObject alloc]init];
/*
*自己持有对象
*/
return obj;
}
如上例所示,原封不动地返回用alloc方法生成并持有的对象,就能让调用方也持有该对象。
alloc/retain/release/dealloc实现(Apple Open Source:http://opensource.apple.com点击打开链接; GUNstep:http://gnustep.org/点击打开链接)
未完待续。。。。
- OC的内存管理--自动引入计数
- OC的内存管理 与 引用计数
- OC使用引用计数的内存管理
- OC的内存管理引用计数机制
- OC基础15:内存管理和自动引用计数
- OC-023.OC在手动内存管理的引用计数
- OC内存管理,MRC,手动引用计数,ARC,自动引用计数
- 面试题 OC引用计数内存管理
- OC 内存管理 --- 引用计数简单使用
- OC内存管理之—引用计数
- 黑马程序员——OC基础:内存管理和自动引用计数(ARC)
- 黑马程序员——OC基础:内存管理和自动引用计数(ARC)
- OC内存管理教程之ARC(二)——自动引用计数规则
- OC 9 内存管理方式 引用计数机制 内存管理的基本原则 copy的实现
- OC-028.ARC自动内存管理的自动释放池
- OC的内存管理
- oc的内存管理
- OC的内存管理
- java语言GUI编程之TextField持有对方引用
- JAVA学习笔记(五)- 数组
- 机器学习入门:线性回归及梯度下降
- Linux内核源代码情景分析-exit()
- MySQL 索引详解
- OC的内存管理--自动引入计数
- Bzoj-1452 Count
- 机器学习入门:牛顿法
- Sicily 1823. Hardest Job Ever!
- JS数字拼图小游戏
- Sicily 1825. Nickname
- Sicily 1013. Going Home
- 第二章作业
- Spring+Hibernate数据保存问题