对iOS中内存处理的一些理解(retain,copy,assain,release,autorelease)
2014-02-10 10:15
399 查看
众所周知,iOS对内存的处理是很出色的,正因为它对内存的处理优化非常好,所以在有限的内存下系统运行的流畅性一直很不错。这里就对编程中对iOS里的retain,copy,assain,release,autorelease说一下我的个人理解。
assign就是直接赋值,当数据为基础数据类型
(NSInteger,CGFloat)和C数据类型(int, float, double, char)时,可以使用assign。
retain只能用于Objective-C对象类型,因为retain会增加对象的引用计数,而基本数据类型或者Core
Foundation对象都没有引用计数。每当引用一次,引用计数加一。release后,引用计数减一。当引用计数为0时,对象所占内存被释放。
我们在h文件中经常这样写:@property
(retain,
nonatomic) XXX 其实就已经引用了一次了,这时即使你对这个对象什么都不做。它的引用计数已经是1了。所以我们要在dealloc函数中把这个对象release掉,把它的引用计数变成0,让他释放掉内存,对于许多iOS初学者来说,总是忘记release。这样的话会造成内存泄露。当我们想对这个对象处理的时候。比如对它alloc,这时引用计数也+1,一定要对它release或autorelease。这时一一对应的。
比如:@property (retain, nonatomic)
NSString* a;
@property (retain, nonatomic)
NSString* b;
a = @"aaa";
b = a;
a和b这里实际上都是指针,a和b都指向了同一块内存 "aaa"。这时a和b的引用计数是1。当我们把a给release的时候,a的引用计数为0。是不是应该把它所指向的内存“aaa”也释放掉呢?这肯定是不行的,因为我不知道b还用不用。如果把内存释放了的话,当调用b的时候岂不是会crash。没错,系统也是这么做的,内存并没有被释放,那系统怎么判断呢?判断b的引用计数,好的,为1,不释放,只有a和b的引用计数都为0时,才释放这块内存。
注意:把对象添加到数组中时,引用计数将增加对象的引用计数+1。
copy是内容复制,当使用了copy时,是有2个内容相同的内容,占的却是2个不同的内存地址。
release与autorelease
release是手动释放,由程序员手动控制。autorelease是自动释放,由系统控制。
如果你能够真正的理解autorelease,那么你才是理解了Objective
c的内存管理。Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autorelease
pool中,当该pool被释放时,该pool中的所有Object会被调用Release。
在项目中,会有一个默认的Autorelease pool,程序开始时创建,程序退出时销毁,按照对Autorelease的理解,岂不是所有autorelease pool里的对象在程序退出时才release,这样跟内存泄露有什么区别?
实际上,对于每一个Runloop,系统会隐式创建一个Autorelease pool。这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。
那什么是一个Runloop呢? 一个UI事件,Timer call, delegate call, 都会是一个新的Runloop。
这里,我推荐多使用autorelease。
assign就是直接赋值,当数据为基础数据类型
(NSInteger,CGFloat)和C数据类型(int, float, double, char)时,可以使用assign。
retain只能用于Objective-C对象类型,因为retain会增加对象的引用计数,而基本数据类型或者Core
Foundation对象都没有引用计数。每当引用一次,引用计数加一。release后,引用计数减一。当引用计数为0时,对象所占内存被释放。
我们在h文件中经常这样写:@property
(retain,
nonatomic) XXX 其实就已经引用了一次了,这时即使你对这个对象什么都不做。它的引用计数已经是1了。所以我们要在dealloc函数中把这个对象release掉,把它的引用计数变成0,让他释放掉内存,对于许多iOS初学者来说,总是忘记release。这样的话会造成内存泄露。当我们想对这个对象处理的时候。比如对它alloc,这时引用计数也+1,一定要对它release或autorelease。这时一一对应的。
比如:@property (retain, nonatomic)
NSString* a;
@property (retain, nonatomic)
NSString* b;
a = @"aaa";
b = a;
a和b这里实际上都是指针,a和b都指向了同一块内存 "aaa"。这时a和b的引用计数是1。当我们把a给release的时候,a的引用计数为0。是不是应该把它所指向的内存“aaa”也释放掉呢?这肯定是不行的,因为我不知道b还用不用。如果把内存释放了的话,当调用b的时候岂不是会crash。没错,系统也是这么做的,内存并没有被释放,那系统怎么判断呢?判断b的引用计数,好的,为1,不释放,只有a和b的引用计数都为0时,才释放这块内存。
注意:把对象添加到数组中时,引用计数将增加对象的引用计数+1。
copy是内容复制,当使用了copy时,是有2个内容相同的内容,占的却是2个不同的内存地址。
release与autorelease
release是手动释放,由程序员手动控制。autorelease是自动释放,由系统控制。
如果你能够真正的理解autorelease,那么你才是理解了Objective
c的内存管理。Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autorelease
pool中,当该pool被释放时,该pool中的所有Object会被调用Release。
在项目中,会有一个默认的Autorelease pool,程序开始时创建,程序退出时销毁,按照对Autorelease的理解,岂不是所有autorelease pool里的对象在程序退出时才release,这样跟内存泄露有什么区别?
实际上,对于每一个Runloop,系统会隐式创建一个Autorelease pool。这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。
那什么是一个Runloop呢? 一个UI事件,Timer call, delegate call, 都会是一个新的Runloop。
这里,我推荐多使用autorelease。
相关文章推荐
- IOS 学习之 —— 内存管理alloc,assign,retain,copy,release,autorelease
- IOS开发 @property中assign、copy 、retain等关键字的理解
- IOS基础:retain,copy,assign及autorelease
- IOS基础:retain,copy,assign及autorelease
- 转(ios实战):retain,copy,assign及autorelease ,strong,weak
- OC基础:内存(进阶):retain.copy.assign的实现原理 分类: ios学习 OC 2015-06-26 17:36 58人阅读 评论(0) 收藏
- IOS基础:retain,copy,assign及autorelease
- iOS开发知识点装逼1:理解assign,copy,retain变strong
- IOS基础:retain,copy,assign及autorelease
- IOS基础:retain,copy,assign及autorelease
- IOS基础:retain,copy,assign及autorelease
- Objective-C的@property 详解(ios,iphone,xcode,retain,release,assign,copy)
- IOS基础:retain,copy,assign及autorelease
- 【ios】理解assign,copy,retain变strong
- iOS开发-retain/assign/strong/weak/copy/mutablecopy/autorelease区别
- iOS开发知识点装逼1:理解assign,copy,retain变strong
- iOS -- retain,copy,assign及autorelease ,strong,weak
- Objective-C的@property 详解(ios,iphone,xcode,retain,release,assign,copy)
- 内存管理: alloc, retain, release, autorelease, copy, assign
- 个人理解的IOS开发Objective-C中的属性readwrite,readonly,retain,assign,copy,nonatomic,strong,weak.