引用计数器

当一个对象被创建出来,就要分配给内存这个对象,当不用这个对象的时候,就要及时的回收,为了可以明确知道对象有没有被使用,就要用引用计数器来体现,只要计数器不为0,表明对象被使用中。

1.方法的基本使用

1> retain :计数器+1,会返回对象本身

2> release :计数器-1,没有返回值

3> retainCount :获取当前的计数器

4> dealloc

* 当一个对象要被回收的时候,就会调用

* 一定要调用[super dealloc],这句调用要放在最后面

2.概念

1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用

2> 野指针 :指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)

3> 空指针 :没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错

常见错误:

EXC_BAD_ACCESS : 访问了一块坏的内存(已经被回收、已经不可用的内存

-[Person setAge:]: message sent to deallocated instance 0x100109a10

给已经释放的对象发送了一条-setAge:消息

set方法内存管理

如果一个指针指向一个新创建出来的对象,对象的计数器会加1,当指针又指向了一个新的对象的时候,原来的对象占用的内存就应该要及时的释放,这个时候就需要对set方法重写,对对象的计数器做一次管理

- (void)setCar:(Car *)car

{

    if (car != _car)

    {

        // 对当前正在使用的车(旧车)做一次release

        [_car release];

        // 对新车做一次retain操作

        _car = [car retain];

    }

}

说明:基本数据类型不需要管理内存

在对象被回收的时候会自动调用dealloc方法

- (void)dealloc

 {

    [_car release];

    [super dealloc];

 }

内存管理代码规范:

只要调用了alloc,copy,必须有release(autorelease)

对象不是通过alloc或者copy产生的,就不需要release

autorelease和autoreleasePool

1.autorelease的基本用法

1> 会将对象放到一个自动释放池中

2> 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作

3> 会返回对象本身

4> 调用完autorelease方法后,对象的计数器不变

2.autorelease的好处

1> 不用再关心对象释放的时间

2> 不用再关心什么时候调用release

3.autorelease的使用注意

1> 占用内存较大的对象不要随便使用autorelease

2> 占用内存较小的对象使用autorelease,没有太大影响

4.错误写法

1> alloc之后调用了autorelease,又调用release

 @autoreleasepool

 {

    // 1

    Person *p = [[[Person alloc] init] autorelease];

    // 0

    [p release];

 }

2> 连续调用多次autorelease

@autoreleasepool

 {

    Person *p = [[[[Person alloc] init] autorelease] autorelease];

 }

5.自动释放池

1> 在iOS程序运行过程中,会创建无数个池子。这些池子都是以栈结构存在(先进后出)

2> 当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池

说明:

1.autorelease方法会返回对象本身

2.调用完autorelease方法后,对象的计数器不变

3.autorelease会将对象放到一个自动释放池中

4.当自动释放池被销毁时,会对池子里面的所有对象做一次release操作

黑马程序员_ Objective-c 内存管理笔记的更多相关文章

  1. 黑马程序员_<<GUI(图形用户管理)-----2>>

    --------------------ASP.Net+Android+IOS开发..Net培训.期待与您交流! -------------------- 8.对话框 对列出目录内容增加了对话框提示, ...

  2. 大数据-将MP3保存到数据库并读取出来《黑马程序员_超全面的JavaWeb视频教程vedio》day17

    黑马程序员_超全面的JavaWeb视频教程vedio\黑马程序员_超全面的JavaWeb教程-源码笔记\JavaWeb视频教程_day17-资料源码\day17_code\day17_1\ 大数据 目 ...

  3. 2016年8月17日 内省(1)18_黑马程序员_使用beanUtils操纵javabean

    8.内省(1):18_黑马程序员_使用beanUtils操纵javabean 1.导入两个包: 2.调用静态方法. 9.泛型 map.entrySet() :取出map集合的键值对组成一个set集合. ...

  4. 程序员必读:Linux内存管理剖析

    现在的服务器大部分都是运行在Linux上面的,所以作为一个程序员有必要简单地了解一下系统是如何运行的. 对于内存部分需要知道: 地址映射 内存管理的方式 缺页异常 先来看一些基本的知识,在进程看来,内 ...

  5. 黑马程序员_高新技术之javaBean,注解,类加载器

    ----------- android培训.java培训.java学习型技术博客.期待与您交流! ---------- 第一部分 javaBean 一,由内省引出javaBean 1,内省: 内省对应 ...

  6. 黑马程序员_ JAVA中的多线程

    ------- android培训.java培训.期待与您交流! ---------- 尽管线程对象的常用方法可以通过API文档来了解,但是有很多方法仅仅从API说明是无法详细了解的. 本来打算用一节 ...

  7. 【译】x86程序员手册13-第5章 内存管理

    Chapter 5 Memory Management 内存管理 The 80386 transforms logical addresses (i.e., addresses as viewed b ...

  8. JavaWeb开发之四:servlet技术 黑马程序员_轻松掌握JavaWeb开发之四Servlet开发 方立勋老师视频教程相当的经典

    总结: 记住:servlet对象在应用程序运行的过程中只创建一次,浏览器每次访问的时候,创建reponse对象 request对象,然后调用servlet的service方法,reponse对象和re ...

  9. 黑马程序员_ Objective-c 面向对象笔记详解

    1)类,对象,方法 类 类名: 1) 类名的第一个字母必须是大写 2) 不能有下划线 3) 多个英文单词,用驼峰标识 类的声明和实现 类的声明 @interface 类名 : NSObject { @ ...

随机推荐

  1. NGUI实现ScrollView功能

    NGUI,目前Unity3D Assert Store中最火的2D图形界面工具. 本文假设读者有Unity3D使用经验.有基本了解.NGUI3.6.0 1.新建Pannel(Scroll View), ...

  2. Outline of Apache Jena Notes

    1 description 这篇是语义网应用框架Apache Jena学习记录的索引. 初始动机见Apache Jena - A Bootstrap 2 Content 内容组织基本上遵循Jena首页 ...

  3. krpano 小记

    给网易漫画部做了一个全景的纸盒视频,在这里记录一些功能实现点. 背景音乐的播放: 1.插件引用 <plugin name="soundinterface"         u ...

  4. 通过BroadCast与service时时监听网络变化

    首先需要一个service: 这里我定义了一个NetworkStateService,在这个service中我写了一个BroadcastReceiver用于监听网络状态发生改变的情况并在这个servi ...

  5. MediaCodec Name & Type

    OMX.google.mp3.decoder support type:audio/mpegOMX.google.amrnb.decoder support type:audio/3gppOMX.go ...

  6. 第七章:LED将为我闪烁:控制发光二极管

        在之前章节了解到Linux驱动程序可以控制软硬件,可以实现软硬件之间的交互.在这章我们学习LED驱动的实现原理.Linux内核提供了多个与I/O内存交互的函数可以实现控制硬件.    编写LE ...

  7. Python 模块chardet安装 setup.py

    http://pypi.python.org/pypi/chardet#downloads 下载chardet-2.*.*.tar.gz:解压到site-package文件夹, Python及其一些模 ...

  8. android Handler.btionMessage()与Message.obtain()的区别

    类概述 定义一个包含任意类型的描述数据对象,此对象可以发送给Handler.对象包含两个额外的int字段和一个额外的对象字段,这样可以使得在很多情况下不用做分配工作. 尽管Message的构造器是公开 ...

  9. Windows 2012 中文乱码的解决办法

    背景:服务器安装2012 R2英文环境,软件为中文显示.已下载中文语言包安装到服务器上 现象:TXT文档的中文在服务器上打开显示为乱码,复制到本地电脑上可正常显示 解决办法:控制面板-语言-更改日期. ...

  10. spring常用注解

    使用注解构造IOC.替代传统的applicationContext.xml配置<bean/>和<property/> 传统的spring要在applicationContext ...