object c内存管理总结(关东升老师视频笔记)
2013-04-16 20:28
232 查看
一、object c内存管理总结
1:object-c为每个对象提供一个内部计数器,这个计数器跟踪对象的引用次数。所有类都继承自NSObject对象的retain和release方法。
2:浅复制:只复制指针,两个对象拥有同一地址
深复制:重新创建一个对象,原有对象的成员变量的状态也复制过去
3:当对象在多个类中传递时,谁alloc或init或retain,谁就需要release它。在A中实例化,就需要在A丽release,
4:当对象被创建或者拷贝时,引用计数为1.每次保持对象时,就发送retain消息,使对象加1,调用release使其引用计数减1.
把对象传递到其他的类中时,需要retain下,防止在原来的类中被release。
当没有使用alloc来创建对象时就不需要手动release,例如:
二、自动释放池
NSAutoreleasepool * pool=[[NSAutoreleasepool alloc] init];
[pool release];
autorelease不会马上减1,对象的引用计数并不真正变化,而是想内存释放池添加一条记录,记录下对象的这种要求,知道当内存释放池发送drain或release消息时,
三、创建对象的两个方法(构造方法)
以+和类名开头(去掉NS,小写第一个字母,array),就是类级构造方法,
NSString *myString = [NSString stringWithUTF8String:"my string"; //自动释放对象,这种方式实例化的对象是临时对象
以-和initWith开头的就是实例构造方法
类级构造方法不能使用release,可以不用autorelease就可以以自动纳入内存释放池管理
NSString *myString = [[NSString alloc] initWithUTF8String:"my string"; //这种实例化方法,对象会被保留,使用完毕后,必须手动进行释放
实例构造方法,如果发出release消息就马上释放对象,如果发出autorelease消息可以自动纳入内存释放池管理,不会马上释放。
在ios开发中,由于内存相对小,因此基本上都是采用实例构造方法实例化对象,采用发送release消息立刻释放对象内存。
类级构造方法(创建一个对象,创建同时初始化);其特点时方法名以NSArray去点NS并小写首字母开始,arrayWithObject。已
NSArray *weekName1 =[NSArray arrayWithObjects:@“星期一”,nil];
实例构造函数(初始化一个对象),必须手动release
NSArray *weekName=[[NSArray alloc] initWithObjects:@"星期一",nil];
四、属性中的内存管理参数:代替get和set方法。对get,set的控制 readonly 、readwrite,非原子性nonatomic,内存管理的:retain、copy、assign
属性参数--三类 6个参数:内存管理3个,线程管理1个,读写2个
内存管理的三个参数retain、copy、assign
问题:
解决方法:
1、assign参数表示设置时直接赋值,而不是复制或保留它。这种类型非常适合一些基本类型,比如NSInteger和CGFloat,或者就是不想直接拥有的类型,比如委托。
assign相当于如下用法:
2、reatin参数会在赋值时把新值保留(发送retain消息)。此属性只能用于object-c对象类型,而不能用于基本数据类型或者Core Foundation。
retain相当于如下用法:
3、copy在赋值时将新值拷贝一份,拷贝工作由copy方法执行,此属性只对那些实现了NSCopying协议的对象类型有效。
copy相当于如下用法:
1:object-c为每个对象提供一个内部计数器,这个计数器跟踪对象的引用次数。所有类都继承自NSObject对象的retain和release方法。
2:浅复制:只复制指针,两个对象拥有同一地址
深复制:重新创建一个对象,原有对象的成员变量的状态也复制过去
3:当对象在多个类中传递时,谁alloc或init或retain,谁就需要release它。在A中实例化,就需要在A丽release,
4:当对象被创建或者拷贝时,引用计数为1.每次保持对象时,就发送retain消息,使对象加1,调用release使其引用计数减1.
把对象传递到其他的类中时,需要retain下,防止在原来的类中被release。
当没有使用alloc来创建对象时就不需要手动release,例如:
NSString *str= [NSString stringWithString:@"duan"];
5:重写dealloc方法,就是为了释放对象里的成员变量;当对象的引用计数变量为0时,调用dealloc方法。在手动调用dealloc前,首先要做的是释放成员变量。
-(void) dealloc { NSLog(@"释放Song对象..."); [title release]; //先释放成员变量 [artist release]; [super dealloc]; }
二、自动释放池
NSAutoreleasepool * pool=[[NSAutoreleasepool alloc] init];
[pool release];
autorelease不会马上减1,对象的引用计数并不真正变化,而是想内存释放池添加一条记录,记录下对象的这种要求,知道当内存释放池发送drain或release消息时,
三、创建对象的两个方法(构造方法)
以+和类名开头(去掉NS,小写第一个字母,array),就是类级构造方法,
NSString *myString = [NSString stringWithUTF8String:"my string"; //自动释放对象,这种方式实例化的对象是临时对象
以-和initWith开头的就是实例构造方法
类级构造方法不能使用release,可以不用autorelease就可以以自动纳入内存释放池管理
NSString *myString = [[NSString alloc] initWithUTF8String:"my string"; //这种实例化方法,对象会被保留,使用完毕后,必须手动进行释放
实例构造方法,如果发出release消息就马上释放对象,如果发出autorelease消息可以自动纳入内存释放池管理,不会马上释放。
在ios开发中,由于内存相对小,因此基本上都是采用实例构造方法实例化对象,采用发送release消息立刻释放对象内存。
类级构造方法(创建一个对象,创建同时初始化);其特点时方法名以NSArray去点NS并小写首字母开始,arrayWithObject。已
NSArray *weekName1 =[NSArray arrayWithObjects:@“星期一”,nil];
实例构造函数(初始化一个对象),必须手动release
NSArray *weekName=[[NSArray alloc] initWithObjects:@"星期一",nil];
四、属性中的内存管理参数:代替get和set方法。对get,set的控制 readonly 、readwrite,非原子性nonatomic,内存管理的:retain、copy、assign
属性参数--三类 6个参数:内存管理3个,线程管理1个,读写2个
内存管理的三个参数retain、copy、assign
问题:
-(void) setTitle:(NSString *) newTitle { title=newTitle; //把title的指针换掉了,title并没有释放,如果多次调用该方法,内存会不断增加, }
解决方法:
-(void) setTitle:(NSString *) newTitle { [newTitle retain]; //防止在计算过程中将其释放 [title release]; //释放原来的内存 title = [[NSString alloc] initWithString]: newTitle]; //重新分配内存 [newTitle release]; }
1、assign参数表示设置时直接赋值,而不是复制或保留它。这种类型非常适合一些基本类型,比如NSInteger和CGFloat,或者就是不想直接拥有的类型,比如委托。
assign相当于如下用法:
-(void) setTitle:(NSInteger *) newTitle { title=newTitle; //把title的指针换掉了,title并没有释放,如果多次调用该方法,内存会不断增加, }
2、reatin参数会在赋值时把新值保留(发送retain消息)。此属性只能用于object-c对象类型,而不能用于基本数据类型或者Core Foundation。
retain相当于如下用法:
-(void) setTitle:(NSString *) newTitle { [newTitle retain]; //防止在计算过程中将其释放 [title release]; //释放原来的内存 title = [[NSString alloc] initWithString]: newTitle]; //重新分配内存 [newTitle release]; }
3、copy在赋值时将新值拷贝一份,拷贝工作由copy方法执行,此属性只对那些实现了NSCopying协议的对象类型有效。
copy相当于如下用法:
-(void) setTitle:(NSString *) newTitle { [newTitle copy]; //相当于一个副本 [title release]; //释放原来的内存 title = [[NSString alloc] initWithString]: newTitle]; //重新分配内存 [newTitle release]; }
相关文章推荐
- Linux学习笔记(观看韩顺平老师Linux视频的总结)
- 内存管理、堆、栈(观看侯捷老师视频总结)
- css3种布局方式:默认文档流、浮动布局、定位布局-----看张鹏老师视频笔记
- [黑马程序员]14[OC语言]OC内存管理部分学习笔记总结
- 妙味课堂视频笔记总结
- 看陈广老师c#参考视频总结(第三篇)
- 看陈广老师c#参考视频总结(第七篇)
- 记 Linux 学习知识总结 -- 寒江老师视频(三) 文件
- 记 Linux 学习知识总结 -- 寒江老师视频(六) - 文件查找与文件管理
- 记 Linux 学习知识总结 -- 寒江老师视频(七) - SHELL 讲解
- Linux基础之linux的历史(针对韩立刚老师的linux教学视频编写的笔记)
- Objective-C 日记⑤ 内存管理、协议、Category 视频笔记
- DLL动态链接库 总结 看了孙鑫老师的书和笔记 自己做了下 小做总结
- 看陈广老师c#参考视频总结(第四篇)
- 看陈广老师c#参考视频总结(第五篇)
- 看陈广老师c#参考视频总结(第八篇)
- css应用给网页的4种方式(看张鹏老师的视频课程后所总结的)
- 笔记1_看张鹏老师html+css视频所得
- 听老师课堂笔记及感受总结
- 黑马程序员---毕向东老师视频笔记(关于static)