iOS引用计数式内存管理的四种思考方式

一:四种方式

    1.自己生成的对象,自己持有

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

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

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

二:四种方式详解

    1.自己生成的对象,自己持有:

    通过alloc,new,copy,mutableCopy方法生成的对象为自己生成并持有

    id obj = [[NSObject alloc] init];

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

    用alloc,new,copy,mutableCopy以外的方法取得的对象,自己不持有该对象.调用retain方法后才持有该对象

    // 取得对象存在,但自己不持有该对象

    id object = [NSMutableArray   array];

    // 自己持有对象

    [obj  retain];

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

    3.1 情况一:  // 自己生成并持有对象 

    id obj = [[NSObject alloc] init];

    // 释放对象(指向对象的指针仍然被保留在变量obj中,貌似能够访问,但对象一经释放绝对不可访问)

    [obj release];

    3.1 情况二:  // 非自己生成并持有对象

    // 取得对象存在,但自己不持有该对象

    id object = [NSMutableArray  array];

    // 自己持有对象

    [obj  retain];

    // 释放对象

    [obj release];

    注意: 1. release是立即释放; 2. autorelease不立即释放,注册到autoreleasepool中,等到       pool结束时再调用release释放对象.

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

4.1 取得对象存在,并持有对象时释放

id obj = [[NSObject alloc] init];

// 释放对象

[obj release];

// 释放对象之后再次释放(此时由于对象已经被释放,所以现在不持有该对象,这时再次释放会导致崩溃)

[obj release];

4.1 取得对象存在,但不持有对象时释放

// 取得对象存在,但自己不持有该对象

id object = [NSMutableArray  array];

[obj  release]; // 由于此时释放了自己不持有的对象,会造成崩溃

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容