您的位置:首页 > 移动开发 > IOS开发

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的时候,②屋子里有三个人,有一个人要走了,他不能走了就把灯关了,这样别的人都处于黑暗当中了(过度释放),无法工作了,所以要最后一个走的人把灯关了(正常释放对象)也就说,内存管理要由谁开辟 由谁释放!这样才能保持一个和谐的内存使用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS OC相关语法