黑马程序员———OC学习第五天(内存管理)
2015-04-16 23:43
302 查看
-------
Android培训、Java培训、IOS培训、.NET培训 期待与您交流! ----------
当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要在使用的内存空间。比如回收一些不需要使用的对象、变量等
管理范围:任何继承了NSObject的对象,对基本数据类型不需要管理内存
当一个对象被销毁时,系统会自动向对象发送一条dealloc消息
一般会重写dealloc方法,在这里释放相关资源,dealloc就像是对象的遗言
一旦重写了dealloc方法,就必须调用[super dealloc]方法,并且放在最后
不要直接调用dealloc方法
一旦对象被回收,它所占用的内存就不再使用,坚持使用会导致程序崩溃(野指针错误EXC_BAD_ACCESS)
release: 计数器-1
retainCount:获取当前计数器个数
eg:
eg:
是否生成set方法
多线程管理
setter和getter方法的名称
eg:
系统自带创建对象的方法中,如果不包含alloc、new、copy,那么这些方法返回的对象都是已经atuorelease过的([NSString stringWithFormat:@"%d",100])
开发中经常写一些类方法快速创建一个atuorelease的对象(创建对象的时候不要直接使用类名,用self)
eg
Android培训、Java培训、IOS培训、.NET培训 期待与您交流! ----------
内存管理
1、什么是内存管理
移动设备的内存极其有限,每个app所能占用的内存是有限制的当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要在使用的内存空间。比如回收一些不需要使用的对象、变量等
管理范围:任何继承了NSObject的对象,对基本数据类型不需要管理内存
2、对象的销毁
当一个对象的引用计数器为0时,它将会被销毁,其所占用的内存被释放当一个对象被销毁时,系统会自动向对象发送一条dealloc消息
一般会重写dealloc方法,在这里释放相关资源,dealloc就像是对象的遗言
一旦重写了dealloc方法,就必须调用[super dealloc]方法,并且放在最后
不要直接调用dealloc方法
一旦对象被回收,它所占用的内存就不再使用,坚持使用会导致程序崩溃(野指针错误EXC_BAD_ACCESS)
3、计数器的基本操作
retain:计数器+1release: 计数器-1
retainCount:获取当前计数器个数
eg:
// ...... Person *p = [Person alloc] init] // 获取当前计数器个数 int count = [p retainCount]; // 计数器+1 [p retain]; // 计数器-1 [p release]; // .....
4、set方法的内存管理
核心思想:release旧值,retain新值eg:
// 假设人拥有Car对象,set方法 - (void)setCar:(Car *)car { // 判断是否是新车 if ( _car != car ) { // release 旧值 [_car release]; // retain 新值,retain方法是有返回值的,返回值是它本身 _car = [car retain]; } }
5、@property参数
set方法内存管理相关参数是否生成set方法
多线程管理
setter和getter方法的名称
eg:
/* 1.set方法内存管理相关的参数 * retain : release旧值,retain新值(适用于OC对象类型) * assign : 直接赋值(默认,适用于非OC对象类型) * copy : release旧值,copy新值 2.是否要生成set方法 * readwrite : 同时生成setter和getter的声明、实现(默认) * readonly : 只会生成getter的声明、实现 3.多线程管理 * nonatomic : 性能高 (一般就用这个) * atomic : 性能低(默认) 4.setter和getter方法的名称 * setter : 决定了set方法的名称,一定要有个冒号 : * getter : 决定了get方法的名称(一般用在BOOL类型) */
6、atuorelease
atuorelease本身不加减对象引用计数器,只是将对象放到自动释放池中,当池子销毁的时候自动调用对象的release方法系统自带创建对象的方法中,如果不包含alloc、new、copy,那么这些方法返回的对象都是已经atuorelease过的([NSString stringWithFormat:@"%d",100])
开发中经常写一些类方法快速创建一个atuorelease的对象(创建对象的时候不要直接使用类名,用self)
eg
@autoreleasepool{ // 创建一个atuorelease的对象 Person *p = [[[Person alloc] init] autorelease]; } // 池子销毁时自动调用[p release]
相关文章推荐
- 黑马程序员之ios学习总结——12 OC语言的内存管理2
- 黑马程序员——OC的内存管理学习小结
- 黑马程序员---学习笔记23:OC基础(10)内存管理
- [黑马程序员]14[OC语言]OC内存管理部分学习笔记总结
- 黑马程序员学习笔记_OC之内存管理3ARC
- 黑马程序员--学习OC加强内存管理
- 黑马程序员之ios学习总结——11 OC语言的内存管理1
- 黑马程序员——OC语言学习——OC手动内存管理
- 黑马程序员---OC学习笔记之集合对象的内存管理
- 黑马程序员——OC学习——内存管理
- 黑马程序员-IOS学习笔记 OC 内存管理
- 黑马程序员——OC学习之内存管理和自动释放池
- 黑马程序员 OC------内存管理学习
- 黑马程序员学习笔记_OC之内存管理1
- 黑马程序员-OC学习笔记-----内存管理
- 黑马程序员-[OC]学习之旅-(构造与内存管理)
- 黑马程序员--OC学习日记-OC内存管理学习感悟
- 黑马程序员--IOS入学学习--9-OC中的内存管理
- 黑马程序员学习笔记_OC之内存管理 2
- 黑马程序员-9-Objective-C学习笔记(OC内存管理)