oc -7 内存管理 相关参数 循环引用
2014-12-23 15:35
381 查看
管理范围:任何继承了NSObject的对象,对其他基本数据类型(int、char、float、double、struct、enum等)无效
计数器为4个字节.
给对象发送一条retain消息,可以使引用计数器值+1(retain方法返回对象本身)
给对象发送一条release消息,可以使引用计数器值-1
可以给对象发送retainCount消息获得当前的引用计数器值
2.
对象的销毁 dealloc
当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收
当一个对象被销毁时,系统会自动向对象发送一条dealloc消息
一般会重写dealloc方法,在这里释放相关资源,dealloc就像对象的遗言
一旦重写了dealloc方法,就必须调用[super
dealloc],并且放在最后面调用
不要直接调用dealloc方法一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致程序崩溃(野指针错误)<
4000
/span>
格式如下
换句话说,不是你创建的,就不用你去[auto]release
格式如下: 人拥有书(调用set方法)的时候用 [bool retain],人死了时候(调用dealloc方法)用[_book release].
严谨的set方法:如下
当人不在(调用dealloc)的时候,release book.
曾经让对象的计数器+1,就必须在最后让对象计数器-1
相关参数
循环引用: 你引用我,我引用你.
这样会导致A对象和B对象永远无法释放
@class和#import的区别
#import方式会包含被引用类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器在A.h文件中 B
*b 只是类的声明,具体这个类里有什么信息,这里不需要知道,等实现文件中真正要用到时,才会真正去查看B类中信息
如果有上百个头文件都#import了同一个文件,或者这些文件依次被#improt,那么一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要重新编译一遍,这样的效率也是可想而知的,而相对来讲,使用@class方式就不会出现这种问题了
在.m实现文件中,如果需要引用到被引用类的实体变量或者方法时,还需要使用#import方式引入被引用类
ARC
weak的使用场合
循环引用时候 : 你引用我,我引用你.
一端用strong、一端用weak
查看系统是不是默认ARC :搜索框输入auto
计数器为4个字节.
1. 引用计数器的操作
格式:给对象发送一条retain消息,可以使引用计数器值+1(retain方法返回对象本身)
给对象发送一条release消息,可以使引用计数器值-1
可以给对象发送retainCount消息获得当前的引用计数器值
2.
对象的销毁 dealloc
当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收
当一个对象被销毁时,系统会自动向对象发送一条dealloc消息
一般会重写dealloc方法,在这里释放相关资源,dealloc就像对象的遗言
一旦重写了dealloc方法,就必须调用[super
dealloc],并且放在最后面调用
不要直接调用dealloc方法一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致程序崩溃(野指针错误)<
4000
/span>
格式如下
3. 开启僵尸对象监控
默认情况下,Xcode是不会管僵尸对象的,使用一块被释放的内存也不会报错。为了方便调试,应该开启僵尸对象监控4、 内存管理原则
1. 谁创建,谁release
如果你通过alloc、new或[mutable]copy来创建一个对象,那么你必须调用release或autorelease换句话说,不是你创建的,就不用你去[auto]release
2. 谁retain,谁release
只要你调用了retain,无论这个对象是如何生成的,你都要调用release格式如下: 人拥有书(调用set方法)的时候用 [bool retain],人死了时候(调用dealloc方法)用[_book release].
严谨的set方法:如下
当人不在(调用dealloc)的时候,release book.
3. 总结
有始有终,有加就有减曾经让对象的计数器+1,就必须在最后让对象计数器-1
相关参数
循环引用: 你引用我,我引用你.
1. 循环retain
比如A对象retain了B对象,B对象retain了A对象这样会导致A对象和B对象永远无法释放
2. 解决方案
当两端互相引用时,应该一端用retain、一端用assign@class和#import的区别
#import方式会包含被引用类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器在A.h文件中 B
*b 只是类的声明,具体这个类里有什么信息,这里不需要知道,等实现文件中真正要用到时,才会真正去查看B类中信息
如果有上百个头文件都#import了同一个文件,或者这些文件依次被#improt,那么一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要重新编译一遍,这样的效率也是可想而知的,而相对来讲,使用@class方式就不会出现这种问题了
在.m实现文件中,如果需要引用到被引用类的实体变量或者方法时,还需要使用#import方式引入被引用类
ARC
weak的使用场合
循环引用时候 : 你引用我,我引用你.
一端用strong、一端用weak
查看系统是不是默认ARC :搜索框输入auto
相关文章推荐
- OC基础—内存管理之@property及其参数(补充新知识:循环引用和@class)
- 黑马程序员--ios基础--oc内存管理--@property参数、循环引用、autorelease
- OC_语法入门_day5_内存管理_计数器/set方法/property的参数/循环引用/自动释放池
- 黑马程序员-内存管理之set方法内存管理, property参数,循环引用。
- 探讨OC的内存管理 以及防止循环引用retain cycle 代理为什么用weak block为什么用copy
- OC_内存管理(二)对象复制、循环引用问题、自动释放池
- OC内存管理-ARC-循环引用
- 黑马程序员24——OC之内存管理(循环引用)
- OC-026.内存管理中循环引用的问题
- OC加强day1-内存管理的范围、MRC与ARC、property参数,retain死循环、NSSstring简解、自动释放池、堆栈等得存储方式
- 黑马程序员——OC基础---内存管理(引用计数器,多对象内存管理,set方法的内存管理,模型设计,循环引用)
- Objective-C—引用计数器、多个对象之间的内存管理、set方法的内存管理、@property参数、循环引用
- OC中内存管理问题之引用计数
- OC基础-内存管理-引用计数器+set方法
- 黑马程序员26——OC之内存管理(property参数)
- OC学习篇之---循环引用问题
- IOS开发---OC语言-㉓类的循环引用
- IOS开发---OC语言-㉘内存管理ARC循环调用
- 黑马程序员---06@property内存管理中如何避免循环引用的问题
- OC基础—内存管理之引用计数器