天天瞎忙活,QQ:705719110,欢迎来撩!

iOS学习笔记(十八)————内存管理

iOS基础 随风 257℃ 0评论

我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上)。如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存。其他高级语言如Java都是通过垃圾回收机制来解决这个问题的,但在OjbC中并没有类似的垃圾回收机制,因此它的内存管理就需要由开发人员手动维护。

一、什么事引用计数

在Xcode4.2及之后的版本中由于引入了ARC(Automatic Reference Counting)机制,程序编译时Xcode可以自动给你的代码添加内存释放代码,如果编写手动释放代码Xcode会报错,因此现在我们要来实验手动内存管理(MRC),必须按照以下的步骤手动关闭ARC,这样才有助于你理解ObjC的内存回收机制。在ObjC中使用引用计数器来管理内存,在ObjC中每个对象内部都有一个与之对应的整数(retainCount),当一个对象在创建之后它的引用计数器为1,当调用这个对象的alloc、retain、new、copy方法之后引用计数器自动在原来的基础上加1(ObjC中调用一个对象的方法就是给这个对象发送一个消息),当调用这个对象的release方法之后它的引用计数器减1,如果一个对象的引用计数器为0,则系统会自动调用这个对象的dealloc方法来销毁这个对象。

mrc-arc

二、能够让引用计数增加的操作

在ObjC中 alloc 、new 、retain 、 copy 会使对象的引用计数+1;addsubview、addobject、push、 property也会使对象的引用计数+1;对象打点调用 也会让引用计数+1;静态方法来创建的对象 引用计数系统+1 , 但是我们不用考虑释放,如果通过静态方法创建的 在某个时刻会被释放掉,但又想去使用这个对象 就可以用调用retain 方法

三、能够让引用计数减少的操作

有让引用计数增加的操作,对应的也会有让其减少的操作,release 、autoRelease 会让对象的引用计数 -1;remove*也能让引用计数 -1;

但是要注意一下下面说的野指针的问题

而对于全局的变量我们要在dealloc中去释放掉,因为我们毕竟不知道在哪个位置会使用到,所以不能在创建之后就释放

那现在我们就可以考虑一下我们以前的set方法是不是有问题了呢?答案肯定是的,如果一个属性中 赋值相同的对象,这时在set方法中就要作如下判断,为什么要加判断 当创建对象时 引用计数为1 self.之后对象的引用计数为2 ( 创建对象那次的+1 要release掉) 此时引用计数为1 如果没有判断直接会对象的引用计数为0 就会调用dealloc方法 就会造成数据丢失

四、内存管理原则

从上面的用法中我们可以总结出来内存管理的基本原则,那就是 谁创建,谁释放;谁引用,谁管理,简单理解就是谁 retain 了 谁就 release

五、属性描述参数

我们开发的时候也不是很经常的去写set/get方法,一般都采用描述的方式来创建属性,描述的时候有很多的参数,我们来看一下参数的意义

property

其实一般我们遵循下面的使用步骤就可以了
id assign,NSString copy,其他的都用retain

代码请查看 http://git.oschina.net/zcb1603999/LearningiOS

转载请注明:怼码人生 » iOS学习笔记(十八)————内存管理

喜欢 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址