内存管理的原因
系统资源有限,所以每个app所能占用的内存是有限制的
OC中提供了一个机制来实现内存管理,它被称为“引用计数
· 每一个对象都有一个引用计数(retain count)
· 对象被创建的时候,引用计数的值是1
· 当引用计数值是0的时候,对象将被系统统一销毁
· 我们可以通过调用一些方法来操作引用计数的值
管理范围:任何继承了NSObject的对象,对其他基本数据类型(int、char、float、double、struct、enum等)无效
每个OC对象内部专门有4个字节的存储空间来存储引用计数器
3.引用计时器操作
对象的建立:
· alloc:为一个新对象分配内存,并且它的引用计数为1。调用alloc方法,你便有对新对象的所有权
· copy:制造一个对象的副本,该副本的 引用计数为1,调用者具有对副本的所有权
· retain:使对象的引用计数加1,并且获得对象的所有权
对象的销毁:
· release:使对象的引用计数减1,并且放弃对象的所有权
· autorelease:使对象的引用计数在未来的某个时候减1,并且在那个时候放弃对象的所有权
当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收
1 当一个对象被销毁时,系统会自动向对象发送一条dealloc消息
2 一般会重写dealloc方法,在这里释放相关资源,dealloc就像对象的遗言
3 一旦重写了dealloc方法,就必须调用[super dealloc],并且放在最后面调用
4 不要直接调用dealloc方法
关于retaine的操作
1 给对象发送一条retain消息,可以使引用计数器值+1(retain方法返回对象本身)
2 给对象发送一条release消息,可以使引用计数器值-1
3 可以给对象发送retainCount消息获得当前的引用计数器值
对象的销毁
1 当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收
2 当一个对象被销毁时,系统会自动向对象发送一条dealloc消息
3 一般会重写dealloc方法,在这里释放相关资源,dealloc就像对象的遗言
4 一旦重写了dealloc方法,就必须调用[superdealloc],并且放在最后面调用
5 不要直接调用dealloc方法
6 一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致程序崩溃(野指针错误)
内存管理原则:
1.只要对象存在就不会销毁。
2 对自己创建的对象负责。
3 谁创建,谁release
通过alloc、new或[mutable]copy来创建一个对象,那么你必须调用release或autorelease
不是自己创建的不能去release.
4 谁retain,谁release
对一个对象调用了 retain,,就必须相应的调用release
autorelease
1 给某个对象发送一条autorelease消息时,就会将这个对象加到一个自动释放池中
2. 当自动释放池销毁时,会给池子里面的所有对象发送一条release消息
3 调用autorelease方法时并不会改变对象的计数器,并且会返回对象本身
4. autorelease实际上只是把对release的调用延迟了,对于每一次autorelease,系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有对象会被调用Release