一、管理范围:任何继承了NSObject的对象,对基本数据类型无效

原理:

1.每个对象都有个引用计数器,是一个与之关联的整数

2.使用了

3.给对象发送一条retain消息,可以使对计数器+1

4.给对象发送一条release消息,可以使对计数器-1

5.当一个对象的的引用计数器的值为时,那么它将被销毁,OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法(类似遗言遗言),一定不要直接调用dealloc方法

- (void)dealloc{

NSLog(@"%@被销毁了",self);

[superdealloc];//一定要调用super的dealloc方法,而且最好放在最后面调用

}

6.可以给对象发送retainCount消息获得当前的引用计数器值

NSLog(@"count=%zi",[obj retainCount]);

二、内存管理的原则

1.谁创建,谁释放,如果你通过alloc,new或者copy创建一个对象,那么你必须调用release或autorelease,不是你创建的,就不用去释放

2.一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease

3.谁retain,谁release,如果调用了retain,就算没创建对象,也要release

三、自动释放池(autorelease pool)

自动释放池是OC里面一种内存自动回收机制,一般可以将一些临时变量添加到自动释放池中,统一回收释放。

当自动释放池销毁,池里所有对象都会调用一次release方法

如何将对象加入自动释放池?

OC对象只需要发送一条autorlease消息,就会把这对象添加到最近的自动释放池中(栈顶的释放池)

autorelease实际上只是把对release的调用延迟了,系统只是把对象放入到池中,当池被释放时,所有池中对象就会调用一次release

//@autoreleasepool代表创建一个自动释放池(IOS5后)

@autoreleasepool{

  Student *stu = [[[Student alloc] init] autorlase];

}

一般可以写一个创建对象的静态方法

+ (id)student{//潜规则,方法名和类名一致,开头字母改为小写

  Student *stu = [[[Student alloc] init] autorlase];

  return stu;

}

autoreleasepool注意

1.不要把大量循环操作昂到同一个自动释放池(NSAutoreleasePool)之间,这样会造成内存峰值上升

2.尽量避免打对大内存使用该方法

3.SKD中一般利用静态方法创建的对象都已经是 autorelease的,不需要在进行release操作

三、Object-C内存管理的更多相关文章

  1. 分布式缓存技术memcached学习(三)——memcached内存管理机制

    几个重要概念 Slab memcached通过slab机制进行内存的分配和回收,slab是一个内存块,它是memcached一次申请内存的最小单位,.在启动memcached的时候一般会使用参数-m指 ...

  2. 分布式缓存技术memcached学习系列(三)——memcached内存管理机制

    几个重要概念 Slab memcached通过slab机制进行内存的分配和回收,slab是一个内存块,它是memcached一次申请内存的最小单位,.在启动memcached的时候一般会使用参数-m指 ...

  3. OC第三天(内存管理)

    内存管理: 1.作用范围: 不论什么继承了NSObject的对象,堆基本数据类型无效如:int a ,float price;;等 2.原理: 每一个对象内部都保存了一个与之相关的整数,称为引用计数器 ...

  4. DPDK内存管理-----(三)rte_malloc内存管理

    rte_malloc()为程序运行过程中分配内存,模拟从堆中动态分配内存空间. void * rte_malloc(const char *type, size_t size, unsigned al ...

  5. cocos2d-x内存管理

    Cocos2d-x内存管理 老师让我给班上同学讲讲cocos2d-x的内存管理,时间也不多,于是看了看源码,写了个提纲和大概思想 一.   为什么需要内存管理 1. new和delete 2. 堆上申 ...

  6. 理解CPU内存管理

    概述:从设计层面理解CPU的内存模式,包括段式内存管理.页式内存管理以及虚拟化扩展内存管理.实际上,硬件支持与软件实现从来就不是能分开讲的,比如,Intel CPU架构师在选择CPU的硬件特性时,必然 ...

  7. Windows内存管理[转]

    本文主要内容:1.基本概念:物理内存.虚拟内存:物理地址.虚拟地址.逻辑地址:页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一.基本概念1. 两个内存概念物理内存 ...

  8. 【Spark-core学习之八】 SparkShuffle & Spark内存管理

    [Spark-core学习之八] SparkShuffle & Spark内存管理环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 ...

  9. RT-thread内核之小内存管理算法

     一.动态内存管理 动态内存管理是一个真实的堆(Heap)内存管理模块,可以在当前资源满足的情况下,根据用户的需求分配任意大小的内存块.而当用户不需要再使用这些内存块时,又可以释放回堆中供其他应用分配 ...

随机推荐

  1. KEIL中头文件使用配置向导

    在xxx.h头文件的代码中夹杂的“<h>      </h>”.“<o>”“<i>”.“<c1>   </c>”和“<e& ...

  2. E. Three strings 广义后缀自动机

    http://codeforces.com/problemset/problem/452/E 多个主串的模型. 建立一个广义后缀自动机,可以dp出每个状态的endpos集合大小.同时也维护一个R[]表 ...

  3. python单元测试框架-unittest(三)之用例执行顺序

    执行顺序规则: 测试类或测试方法的数字与字母顺序0~9,A-Z 执行如下脚本,理解用例执行顺序 #coding=utf-8 import unittest class Test1(unittest.T ...

  4. PHP速学

    基本代码 <?php echo "Hello world";?> 变量定义 <?php $a=true; $bool_value=true; $integer_v ...

  5. idea编译golang插件总结

    由于使用习惯了Idea 和vim插件.于是下载了idea的go插件并安装,可惜不支持go1.4 ,官方的go插件版本太低 133.326 — 133.9999 .只能手动编译 按照这个教程就可以 ht ...

  6. 快速学习 Python 数据分析包 之 pandas

    最近在看时间序列分析的一些东西,中间普遍用到一个叫pandas的包,因此单独拿出时间来进行学习. 参见 pandas 官方文档 http://pandas.pydata.org/pandas-docs ...

  7. GitKraken使用教程-基础部分(3)

    5. 克隆服务器上的项目 首先,返回主界面,点击File => Clone Repo,选择 Clone with URL,如下图: 图 5‑1 SSH方式克隆仓库界面 1) SSH 方式连接仓库 ...

  8. Mysql显示行号

    SELECT `Name`,(@rowNum:=@rowNum+1) AS rowNo FROM bas_student,(SELECT (@rowNum :=0)) a LIMIT 10;

  9. 《Google软件测试之道》之学习笔记01

    Google软件测试介绍 软件测试团队->工程生产力(Engineering Productivity) http://googletesting.blogspot.com/2011/01/ho ...

  10. springmvc+spring+mybatis+sqlserver----插入一条新数据

    <insert id="addOneMsg" parameterType="java.util.Map"> INSERT INTO PDA_JWL_ ...