内存问题

  1. 野指针异常:访问所有权的内存,如果想要安全访问,必须确保空间还在(确保访问的内存不是僵尸对象)
  2. 内存泄露:空间使用完之后没有及时释放
  3. 过度释放:对一块空间释放多次,立刻crash
  4. 内存溢出:所有存储空间被占用

管理内存的三种方式

  1. 垃圾回收机制:程序员只要开辟存储空间,系统会自动回收内存。Java采用的机制。
  2. MRC:手动引用计数机制,由开发员开辟空间,手动添加影响引用计数增加或减少的方法,能够灵活的控制空间合适释放
  3. ARC:自动引用计数机制,是iOS 5.0 推出的,基于MRC,不需要程序员手动添加管理内存代码,编译器会在合适的地方添加管理内存的代码

引用计数机制:

iOS采用计数器来管理内存,当你拥有这个对象的时候,需要使用该对象的引用计数+1,当对象的引用计数器为0的时候,表示没有任何对象对该对象持有,那么这个时候系统会

自动调用dealloc方法来回收对象的存储空间

影响引用计数器的方法

使引用计数器+1的方法: alloc, retain, copy

使引用计数器-1的方法:release, autoreleae

retainCount 是ARC才有的机制所以要将MRC转换ARC

如图所示:将ARC模式关闭

1.release 使用引用计数减一

 Person *person = [[Person alloc]init];
NSLog(@"retainCount = %lu",person.retainCount);
[person release];
NSLog(@"retainCount = %lu",person.retainCount);

2. retain使引用计数加一

 Person *person = [[Person alloc]init];
NSLog(@"retainCount = %lu",person.retainCount);
[person retain];
NSLog(@"retainCount = %lu",person.retainCount);

3.野指针和僵尸对象

         Person *person = [[Person alloc]init];
NSLog(@"retainCount = %lu",person.retainCount);
[person release]; //
NSLog(@"%lu",person.retainCount); // [person release]; //0 当对象的引用计数为0,系统自动调用dealloc方法 person = nil; // 对象置为nil,防止野指针异常
// 僵尸对象指的是:对象的引用计数器变成0后,该块地址被回收,变成不可访问的内存。
// 野指针指的是:指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
// 空指针:没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错

4.开启 zombie 检测

5. 自动释放池

        // 定义一个自动释放池
// 第一种形式
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // pool 1 Person *p1 = [[Person alloc] init];
NSLog(@"%lu", p1.retainCount); [p1 retain]; //
[p1 autorelease];
NSLog(@"p1 = %lu", p1.retainCount);
NSLog(@"pool = %lu", pool.retainCount);
[pool release];

 NSLog(@"p1 = %lu", p1.retainCount); // 1

// 对象使用 autorelease是在未来的某一时刻让对象的引用计数器减一,这个某一时刻是指碰到自动释放池子之后才会释放

 
 // iOS 5.0 之后推荐使用的
// 第二种形式 @autoreleasepool { Person *p2 = [[Person alloc]init];
// [p2 retain];
p2.name = @"p2";
[p2 autorelease];
NSLog(@"p2 = %lu", p2.retainCount); Person *p3 = [[Person alloc]init];
// [p2 retain];
p3.name = @"p3";
[p3 autorelease];
NSLog(@"%lu", p3.retainCount);
}

// 总结:自动释放池的作用:自动释放池会在销毁的时候检查内部有没有autorelease对象,如果有autorelease对象,让该对象的引用计数做一次减一操作(即让池子内所有的引用对象减一)


// 销毁方式 以栈的形式销毁的


6. 内存管理原则

        // 凡是使用alloc, retain让对象的引用计数加一,相应的就该使用release或者autorelease让对象的引用计数减一,业绩也是说增加的次数要和减少的次数相等,才能保障对象的引用计数始终唯0,对象才可以被销毁

//    不想等的情况下,会出现


//        1. 内存泄露:增加的次数大于减少的次数


//        情况一


Person *person1 = [[Person alloc]init];



//        情况二


Person *person2 = [[Person alloc]init];


[person2 retain];    // 2


[person2 release];   // 1


//        情况三


Person *person3 = [[Person alloc]init];

person3 = nil;


[person3 release];

 

 // 2.过度释放:增加的次数小于减少的次数


        Person *person1 = [[Person alloc]init]; // 1

        [person1 retain]; // 2     

        [person1 release]; // 1

      [person1 release]; // 0

      [person1 release]; // 过度释放

        // 3.野指针异常: 增加的次数等于减少的次数,还继续访问

  Person *person =[[Person alloc]init];

     

        [person retain];

        [person release];

        [person release];

        person = nil;

        NSLog(@"person = %lu",person.retainCount);

OC内存管理的更多相关文章

  1. OC 内存管理机制总结

    OC 内存管理机制总结 一:OC内存管理机制目前分为两块,其一自动内存管理机制,其二手动内存管理机制: 1.首先我们从自动内存管理机制讲起: 1)什么是自动内存管理机制,自动内存管理机制就是程序中所创 ...

  2. OC内存管理基础

    OC 内存管理基础 一. retain和release基本使用 使用注意: 1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作) 2.你不想再使用(占用)某个对象,就 ...

  3. QF——OC内存管理详解

    堆的内存管理: 我们所说的内存管理,其实就是堆的内存管理.因为栈的内存会自动回收,堆的内存需要我们手动回收. 栈中一般存储的是基本数据类型变量和指向对象的指针(对象的引用),而真实的对象存储在堆中.因 ...

  4. OC内存管理-OC笔记

    内存管理细节:http://blog.sina.com.cn/s/blog_814ecfa90102vus2.html 学习目标 1.[理解]内存管理 2.[掌握]第一个MRC程序 3.[掌握]内存管 ...

  5. OC内存管理-黄金法则

    1.内存管理-黄金法则 The basic rule to apply is everything that increases the reference counter with alloc, [ ...

  6. OC内存管理总结,清晰明了!

    <span style="font-size:18px;">OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限.所以每一个APP所占的 ...

  7. 31 (OC)* 内存管理

    31 (OC)  内存管理 一:内存管理黄金法则. 如果对一个对象使用了alloc.[Mutable]copy,retain,那么你必须使用相应的realease或者autorelease 二:内存管 ...

  8. iOS学习17之OC内存管理

    1.内存管理的方式 1> iOS应用程序出现Crash(闪退),90%的原因是因为内存问题. 2> 内存问题 野指针异常:访问没有所有权的内存,如果想要安全的访问,必须确保空间还在 内存泄 ...

  9. 【0 - 1】OC内存管理

    一.内存管理概述 垃圾回收机制(GC):由系统管理内存,程序员不需要管理. OC中的垃圾回收:在OC2.0版加入垃圾回收. OC与iOS:OC有垃圾回收机制,但是iOS屏蔽了这个功能.原因:iOS运行 ...

  10. OC内存管理(ARC)

    1.什么是ARC Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入 的最大的变革和最激动人心的变化.ARC是新的LLVM 3. ...

随机推荐

  1. Query Designer:Condition,根据KeyFigure值来过滤数据

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. 自学 web 前端人怎么找工作?

    1,你做过的项目可以体现你的价值.2,你的个人博客可以反映你的思考.3,你的GitHub页面可以展示你的项目.4,你项目中的代码可以看出你编程的风格.1,2,3,4之间有交集.当你能证明,你能创造的价 ...

  3. css的小技巧

    前几天看到<css揭秘>这本书,第一感觉是 css怎么能出这么厚的一本书,不过 细细一想,用好css真的可以实现很多想要的效果,节省很多js代码. 总结几个css的小技巧: 1,将所有元素 ...

  4. 关于composer安装插件时候提示找不到fxp插件时候的解决办法

    如果你在某个目录使用composer.phar,而且在别的目录页使用了composer,并没有全局安装composer的时候,不同目录之间的可能会互相干扰从而报错 root@tyr:/var/www/ ...

  5. JAVA 1.5 运算符

    1. 关系运算符:大于(>).小于(<).等于(==).不等于(!=).大于等于(>=).小于等于(<=),关系运算的结果是个boolean值.2. 逻辑运算符:重点讲解两个, ...

  6. public private, protect. 以及继承。 草稿。

    #include <iostream>#include <thread>#include <memory> // | 父类的public成员 | 父类的protec ...

  7. Control.DataBinding数据绑定简单用法:

    DataBindings的用法: 第一个值:要绑定到TextBox的什么地方 第二个值:数据源是什么 第三个值:应该取数据源的什么属性 第四个值:是否开启数据格式化 第五个值:在什么时候启用数据源绑定 ...

  8. Linux 利用 locate 和 find 查找文件

    Linux 利用 locate 和 find 查找文件 命令 locate 用于快速查找文件.文件夹.此命令并没有在磁盘上查找所有文件,而是在预先建立的数据库里进行搜索.可以使用 updatedb 命 ...

  9. VB检测按键CTRL+C的次数

    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As IntegerPriv ...

  10. python爬虫实战(一)——实时获取代理ip

    在爬虫学习的过程中,维护一个自己的代理池是非常重要的. 详情看代码: 1.运行环境 python3.x,需求库:bs4,requests 2.实时抓取西刺-国内高匿代理中前3页的代理ip(可根据需求自 ...