美文网首页
内存管理的四种思考方式

内存管理的四种思考方式

作者: 香菜那么好吃为什么不吃香菜 | 来源:发表于2020-07-15 15:57 被阅读0次

说在前面的话:本文中经常提到的“自己一词”,可以理解为“对象的使用环境”,但是理解为编程人员“自身“也是木有问题滴。

内存管理的四种方式

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

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

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

*释放非自己持有的对象

1.自己生成的对象,自己所持有
使用 alloc,new,copy,MutableCopy的方法或者以这几个单词开头的方法名称(驼峰命名法)生成的对象都只有自己持有。非驼峰命名法例如allocate,newer等等均不是,不属于同一类别的方法。

2.非自己生成的对象,自己也能持有
用alloc/new/copy/MutableCopy以外的方法取得的对象,不是自己生成并持有的,所以自己不是该对象的持有者。


id obj = [NSMutableArray array]; //取得的对象存在但自己不持有对象。

[obj retain];//自己持有非自己生成的对象

3.不再需要自己持有对象的时候释放
用alloc/copy/new/MutableCopy方法生成对象并持有的对象,或者用retain持有的对象,一旦不再需要,务必用release方法进行释放。


id obj = [[NSObject alloc] init];//自己生成并持有对象 ,引用计数为1

[obj retain];//自己持有对象,引用计数为2

[obj release];//释放对象,引用计数为1.指向对象的指针仍然能被保存在变量obj中,看起来能够访问,但是对象一经释放便不能访问!!!


id obj = [[NSMutableArray alloc] init];//自己生成但不持有持有对象 ,引用计数为0

[obj retain];//自己持有对象,引用计数为1

[obj release];//释放对象,引用计数为0.对象不可再被访问。

如果要用某个方法生成对象,并将其返还给该方法的调用方
(1)方法本身使取得的对象存在并且自己持有对象


- (id) allocObject{  //注意观察函数的命名规则哦

    id obj = [[NSObject alloc] init];//自己生成并持有对象

    return obj;//自己持有对象

}

......

//如果原封不动地调用这个方法,就能让调用方也持有这个对象

id obj1 == [obj0 allocObject];//取得非自己生成并持有的对象

(2) 方法本身使取得的对象存在,但不是自己持有。


- (id) object{ //注意这里的方法命名哦

    id obj = [[NSObject alloc] init]; //自己生成对象并持有对象    

    [obj autorelease];//取得的对象存在但是自己不持有对象

    return obj;

}

......

id obj = [obj0 object];//取得的对象存在但是自己不持有对象

[obj1 retain];//自己持有对象

补充:release与autorelease的区别

[obj release];会立即释放对象,不可再访问

[obj autorelease];不是立即释放,注册到autoreleasepoool中,经过一段时间,pool结束时自动调用release

4.无法释放非自己持有的对象
对于用alloc/new/copy/mutableCopy方法生成并持有的对象,或者是用retain持有的对象,由于持有者是自己,因此在不需要的时候可以释放。由此以外得到的对象不可以释放。在程序中释放了非自己持有的对象就会造成崩溃。


id obj = [[Nsobject alloc] int];//自己生成并持有对象

[obj release];//自己释放对象,不再持有对象

[obj release];//释放了不是自己持有的对象会造成崩溃


id obj1= [obj0 object];//生成对象存在,但是自己不持有

[obj1 release];//释放自己不持有的对象,crash

补充:会发生crash的情况

再度release已经废弃了的对象

访问已经废弃的对象

相关文章

  • The X Developing - XDL For Platf

    内存管理。 XDL实现了四种内存管理方式的函数集,即:堆内存、页内存、全局内存和缓存。堆内存(xmem)为程序在运...

  • iOS内存管理思考方式和所有权修饰符

    1、内存管理的思考方式   引用计数式内存管理的思考方式就是思考ARC所引起的变化。   ● 自己生成的对象,自己...

  • iOS内存管理

    一.内存管理 /引用计数 Objective-C 中的内存管理,也就是引用计数 1.1内存管理的思考方式 自己生成...

  • 内存管理的思考方式

    自己生成的对象,自己持有 非自己生成的对象,自己也能持有 不再需要自己持有的对象时释放 非自己持有的对象无法释放 ...

  • 内存管理的思考方式

    内存管理的思考方式 自己生成的对象,自己持有 非自己生成的对象,自己也能持有 不在需要自己持有的对象时释放 ...

  • 内存管理的思考方式

    自己生成的对象, 自己所持有 非自己生成的对象, 自己也能持有 不再需要自己持有的对象时释放 非自己持有的对象无法...

  • 《Objective-C 高级编程》引用计数 笔记摘要

    内存管理 / 引用计数 内存管理的思考方式 自己生成的对象,自己持有。 非自己生成的对象,自己也能持有。 不再需要...

  • ARC 内存管理的思考方式

    1.自己生成的对象,自己持有 2.非自己生成的对象,自己也能持有 3.不再需要自己持有的对象时释放 4.非自己持有...

  • 操作系统之内存管理

    内存管理 包括内存管理和虚拟内存管理 内存管理包括内存管理概念、交换与覆盖、连续分配管理方式和非连续分配管理方式(...

  • 内存管理与引用计数

    引用计数式内存管理的思考方式 引用计数式的内存管理方式主要涉及四个操作:生成对象,持有对象,释放对象,废弃对象。 ...

网友评论

      本文标题:内存管理的四种思考方式

      本文链接:https://www.haomeiwen.com/subject/ykophktx.html