OC_Memory_内存管理原理
2015-08-12 23:37
204 查看
iOS内存管理方式分为:mrc(手动内存):arc(自动内存)
主要说说mrc手动内存,因为你只有搞懂了它的原理,你才能用好自动管理,要不用了半天自动管理,连内存怎么工作的都不知道,岂不是很尴尬的一件事?
1、OC内存管理的原理
1、OC内存管理管的是引用计数(就是当前对象被引用的数量)①
2、当引用计数大于0的时候,一个对象是可以用的
3、当引用计数减到0的时候,一个对象会自动调用自己的dealloc的方法释放,(另强调:dealloc是有系统调用的,不要手动调用)
4、当对一个对象执行alloc、retain、copy、new等操作时,引用计数都会增加1
5、当对一个对象执行release、autorelease、self.属性名=nil等操作时,引用计数会减少1
2、OC内存管理的使用规则
1、需要为每一个alloc、retain、copy、new等+1操作,准备相应的-1操作,否则对象会一直不释放
2、哪个类+1的,哪个类-1
②
3、如果是类方法创建的对象,那么会类方法内部有一个自动的+1,同样这个+1的-1是也是自动的,不需要我们手动控制
4、如果把一个对象放进一个集合(像数组,字典),那么这个对象会有一个自动+1,同样这个+1对应的-1也是自动的,不需要我们手动控制
5、可以在一个+1后面加上autorelease,这样当这个对象除了自动释放池后,就是调用这个autorelease来-1
3、OC内存管理实用
1、关注当前类有多少个alloc、retain、copy、new等+1,要为他们准备对应数量的release等-1
2、不需要关注别的类的内存管理,每个类自己管理自己的内存计数
3、一个类多个方法,每个方法管里每个方法的内存计数
4、+1的数要等于-1的数,以保证不会内存溢出等错误
5、如果是属性,只有retain和copy需要管理,在该类的dealloc中self.属性名=nil
-1
4、release和dealloc区别
release 是-1 dealloc 是释放
5、类属性的内存管理
1、assign,就是一个弱引用,就是一个指针,只是简单的指明一下,通过它可以使用他指的那个对象,但是他一点也不影响他指的对象的引用计数,如果这个assign属性指的对象引用计数大于0,这个属性就还能用,反之,这个属性就不能用。
2、retain
会使得他指的那个对象的引用计数+1,所以我们需要在这个retain属性所在类的dealloc方法中对这个属性执行self.属性名 =
nil;的-1操作
3、copy,copy会有一个引用计数+1,所以我们需要在这个copy属性所在类的dealloc方法中对这个属性执行self.属性名 =
nil;的-1操作
4、如果一个对象不是用alloc方法申请的内存,而是用类方法申请的内存,同样会有1的引用计数,他会在这个对象出了其声明周期之后,自动-1
5、当一个对象放进数组等集合的时候,这个对象的引用计数会有一个自动+1,当这个对象从集合中移除掉或者这个集合本身被释放的时候,这个自动的+1就会自动的被-1
6、属性的内存管理实际列子
@property(nonatomic,assign)NSString *name;
//assign就是指一下,不影响引用计数
@property(nonatomic,retain)NSString *sex;
//retain,指向一个对象的时候,会使得被指的对象+1,当他又指向别的对象的时候,对原来指的那个对象-1,对新指的对象+1
@property(nonatomic,copy)NSString *age;
//copy,指向一个对象的时候,把这个对象的内容拿过来,自己+1,不影响被指的对象的引用计数,指向新的对象时,先把自己-1,在把新对象的内容拿过来,自己+1
7、关于dealloc的方法:
-(void)dealloc
这个方法不是必须要实现的,也永远不要用对象来直接调用这个方法,这个方法在这个类的对象的引用计数减到0的时候,会自动调用,即时我们这里没有实现,也会被调用,我们之所以在这里实现,是因为我们有时候在这个类的对象被释放的时候,有可能需要处理别的事情
6、autorelease
@autoreleasepool {
//autorelease自动引用计数-1
NSString *str = [[[NSString alloc] initWithFormat:@"%d",4] autorelease];
//这种autorelease的引用计数-1,不是实时的,这个autorelease的原则是这个对象出了所在的自动释放池,才会调用这个autorelease-1
}
解释①②:
举个很形象的例子,①把一个对象比作一间屋子,没有人使用的时候,屋子里面是黑的,没开灯,屋子的被使用数是0. 等有一个人进来了,打开了灯,屋子亮了,屋子的被使用数变成了1, 那么别的人就也可以进来使用了!当 被使用数等于3的时候,②屋子里有三个人,有一个人要走了,他不能走了就把灯关了,这样别的人都处于黑暗当中了(过度释放),无法工作了,所以要最后一个走的人把灯关了(正常释放对象)也就说,内存管理要由谁开辟 由谁释放!这样才能保持一个和谐的内存使用
主要说说mrc手动内存,因为你只有搞懂了它的原理,你才能用好自动管理,要不用了半天自动管理,连内存怎么工作的都不知道,岂不是很尴尬的一件事?
1、OC内存管理的原理
1、OC内存管理管的是引用计数(就是当前对象被引用的数量)①
2、当引用计数大于0的时候,一个对象是可以用的
3、当引用计数减到0的时候,一个对象会自动调用自己的dealloc的方法释放,(另强调:dealloc是有系统调用的,不要手动调用)
4、当对一个对象执行alloc、retain、copy、new等操作时,引用计数都会增加1
5、当对一个对象执行release、autorelease、self.属性名=nil等操作时,引用计数会减少1
2、OC内存管理的使用规则
1、需要为每一个alloc、retain、copy、new等+1操作,准备相应的-1操作,否则对象会一直不释放
2、哪个类+1的,哪个类-1
②
3、如果是类方法创建的对象,那么会类方法内部有一个自动的+1,同样这个+1的-1是也是自动的,不需要我们手动控制
4、如果把一个对象放进一个集合(像数组,字典),那么这个对象会有一个自动+1,同样这个+1对应的-1也是自动的,不需要我们手动控制
5、可以在一个+1后面加上autorelease,这样当这个对象除了自动释放池后,就是调用这个autorelease来-1
3、OC内存管理实用
1、关注当前类有多少个alloc、retain、copy、new等+1,要为他们准备对应数量的release等-1
2、不需要关注别的类的内存管理,每个类自己管理自己的内存计数
3、一个类多个方法,每个方法管里每个方法的内存计数
4、+1的数要等于-1的数,以保证不会内存溢出等错误
5、如果是属性,只有retain和copy需要管理,在该类的dealloc中self.属性名=nil
-1
4、release和dealloc区别
release 是-1 dealloc 是释放
5、类属性的内存管理
1、assign,就是一个弱引用,就是一个指针,只是简单的指明一下,通过它可以使用他指的那个对象,但是他一点也不影响他指的对象的引用计数,如果这个assign属性指的对象引用计数大于0,这个属性就还能用,反之,这个属性就不能用。
2、retain
会使得他指的那个对象的引用计数+1,所以我们需要在这个retain属性所在类的dealloc方法中对这个属性执行self.属性名 =
nil;的-1操作
3、copy,copy会有一个引用计数+1,所以我们需要在这个copy属性所在类的dealloc方法中对这个属性执行self.属性名 =
nil;的-1操作
4、如果一个对象不是用alloc方法申请的内存,而是用类方法申请的内存,同样会有1的引用计数,他会在这个对象出了其声明周期之后,自动-1
5、当一个对象放进数组等集合的时候,这个对象的引用计数会有一个自动+1,当这个对象从集合中移除掉或者这个集合本身被释放的时候,这个自动的+1就会自动的被-1
6、属性的内存管理实际列子
@property(nonatomic,assign)NSString *name;
//assign就是指一下,不影响引用计数
@property(nonatomic,retain)NSString *sex;
//retain,指向一个对象的时候,会使得被指的对象+1,当他又指向别的对象的时候,对原来指的那个对象-1,对新指的对象+1
@property(nonatomic,copy)NSString *age;
//copy,指向一个对象的时候,把这个对象的内容拿过来,自己+1,不影响被指的对象的引用计数,指向新的对象时,先把自己-1,在把新对象的内容拿过来,自己+1
7、关于dealloc的方法:
-(void)dealloc
这个方法不是必须要实现的,也永远不要用对象来直接调用这个方法,这个方法在这个类的对象的引用计数减到0的时候,会自动调用,即时我们这里没有实现,也会被调用,我们之所以在这里实现,是因为我们有时候在这个类的对象被释放的时候,有可能需要处理别的事情
6、autorelease
@autoreleasepool {
//autorelease自动引用计数-1
NSString *str = [[[NSString alloc] initWithFormat:@"%d",4] autorelease];
//这种autorelease的引用计数-1,不是实时的,这个autorelease的原则是这个对象出了所在的自动释放池,才会调用这个autorelease-1
}
解释①②:
举个很形象的例子,①把一个对象比作一间屋子,没有人使用的时候,屋子里面是黑的,没开灯,屋子的被使用数是0. 等有一个人进来了,打开了灯,屋子亮了,屋子的被使用数变成了1, 那么别的人就也可以进来使用了!当 被使用数等于3的时候,②屋子里有三个人,有一个人要走了,他不能走了就把灯关了,这样别的人都处于黑暗当中了(过度释放),无法工作了,所以要最后一个走的人把灯关了(正常释放对象)也就说,内存管理要由谁开辟 由谁释放!这样才能保持一个和谐的内存使用
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器
- iOS开发之路--微博OAuth授权_取得用户授权的accessToken
- ios通过按钮点击异步加载图片
- 加载带有手势识别器的XIB文件需注意哪些问题
- 仅需几行代码实现方便易用的状态栏指示器
- ios中图像进行压缩方法汇总