OC的内存管理--自动引入计数

来源:互联网 发布:http js.zy.com 编辑:程序博客网 时间:2024/05/21 03:25

OC内存管理的思想:

*自己生成的对象,自己持有

*非自己生成的对象,自己也能持有

*不再需要自己持有的对象时释放

*非自己持有的对象无法释放


对象操作与OC对应的方法:
对象操作OC方法生成并持有对象alloc/new/copy/mutableCopy等方法持有对象retain方法释放对象release方法废弃对象dealloc方法

这些有关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/点击打开链接)

未完待续。。。。












0 0
原创粉丝点击