2015.12.21 内存管理(memory management)

Memory Management

1.什么是内存管理?

  程序在运行过程中管理内存分配的过程,当需要内存的时候就申请一片内存空间,不需要就释放掉。

2.如何去管理内存

  站在分配对象拥有权的角度来操作内存。

3.内存管理的两种办法

  a. MRR(Manual Retain Release)手动管理,实现的机制:reference counting(引用计数机制)。

  b. ARC(Auto Reference Counting)自动引用计数,实现机制:系统在程序编译阶段自动添加了释放对象的办法。

4.引起内存错误的两种情况

  a.释放掉一个正在使用的对象。

  b.不用的对象没有释放掉,导致内存泄漏。

5.内存管理的基本原理

  a. 使用"alloc"、"new"、"copy"、"mutableCopy"开头的方法创建的对象 就有拥有权,就应该负责释放。

  b. 不是自己创建的对象,但是又想获得这个对象的拥有权,可以使用retain(属性的stter方法和init方法)。

  c. 当一个对象不在使用了,就应该释放掉自己的那份拥有权(release autorelease)。

  d. 不能去释放一个自己没有拥有权的对象。

6.可以使用autorelease来实现延迟释放,使用场合(在一个方法里面返回一个对象)

- (NSString *)fullName{
    NSString *string = [[[NSString alloc] initWithFormat:@"%@:%@",self.name, self.address] autorelease];
    return string;
}

- (void)printFullName{
    NSString *temp = [self fullName];
    NSLog(@"%@", temp);
}

7. release 和 autorelease的区别

  a. release的优点:可以立刻释放内存

    autorelease的优点:可以延迟释放,操作方便,出错概率小。  在某一段时间内内存是增加的。

  b. 企业里面的使用习惯:autorelease

8. 如何释放掉一个对象本身拥有的资源

  通过在类的实现文件里面重写父类的dealloc方法来实现释放一个对象本身拥有的资源

  a. dealloc方法是当这个对象的拥有者为0,那么系统会自动调用对象的dealloc方法,不能主动去调用

  b. 在dealloc方法里面,先释放掉自己对象的拥有权,然后再调用[super dealloc]释放自己

9. 实际操作

  a. 尽量使用访问器方法来操作属性变量(self.name)。

  b. 在dealloc方法里面尽量不要使用访问器方法。

10. retain cycle

  A对象里面拥有B对象, B对象里面拥有A对象,当A要释放掉自己的时候,必须等B对象释放掉自己对A的拥有权,B对象要释放掉自己的时候,必须等A对象释放对自己的拥有权,所以两者都释放不了。

  解决方案:大的强引用小的(retain strong)  小的弱引用大的(weak)。

11. 不能使用retainCount去查看一个对象的拥有者,只能自己确保代码是按照内存管理的原理来操作的就OK了。



重写setter方法:

- (void)setFirstName:(NSString *)aFirstName{
    if (firstName != aFirstName) {
        [firstName release];
        firstName = [aFirstName retain];
    }
}

- (NSString *)firstName{
    return firstName;
}
时间: 2024-10-05 05:07:12

2015.12.21 内存管理(memory management)的相关文章

内存管理(Memory Management)

        内存管理的方式         垃圾回收机制(gc, garbage collection), 油系统管理内存, 开发人员不需要关心内存, 系统会自动检测, 自动释放, 比如java         注: OC在1.0不支持垃圾回收机制, 到2.0时支持来及回收机制, 但是在iOS平台上苹果把OC的垃圾回收机制屏蔽掉了         iOS不支持垃圾回收机制, 如何管理内存?         通过引用计数(retain count)管理内存         通过引入计数来管理内

【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)

写在前面 感谢全部点进来看的朋友.没错.我眼下打算写一本关于Unity Shader的书. 出书的目的有以下几个: 总结我接触Unity Shader以来的历程,给其它人一个借鉴.我非常明确学Shader的艰难,在群里也见了非常多人提出的问题. 我认为学习Shader还是一件有规律可循的事情,但问题是中文资料难觅,而大家又不愿意去看英文...这对我有什么优点呢?强迫我对知识进行梳理,对细节问题把握更清楚. 第二个原因你懂的. 关于本书的定位问题: 面向Unity Shader刚開始学习的人,但要

Android 内存管理 &Memory Leak & OOM 分析

1.Android 进程管理&内存 Android主要应用在嵌入式设备当中,而嵌入式设备由于一些众所周知的条件限制,通常都不会有很高的配置,特别是内存是比较有限的.如果我们编写的代 码当中有太多的对内存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机.为了能够使得Android应用程序安全且快速的运行,Android 的每个应用程序都会使用一个专有的Dalvik虚拟机实例来运行,它是由Zygote服务进程演变过来的,也就是说每个应用程序都是在属于自己的进程中运行的.一方面,如果程序在运行

Objective-C Memory Management Being Exceptional 异常处理与内存

Objective-C Memory Management ? ?Being Exceptional ?异常处理与内存 3.1Cocoa requires that all exceptions must be of type NSException cocoa?需要所有的异常是NSException类型的. so even though you can throw an exception from other objects, Cocoa isn't set up to deal with

SQL Server 2012笔记分享-6:理解内存管理

内存管理 – SQL Server 2005/2008/2008r2 SQL Server 2012以前的版本(SQL 2005/2008/2008R2),有single page allocator 和multi page allocator.也就是说,如果申请的内存是8k以内的,就会有单页分配器分配,而大于8kb的内存请求,使用multi page 分配器来管理.如图所示. 使用select * from sys.dm_os_memory_clerks查询memory clerk,会发现si

操作系统内存管理、Cache调度策略学习

目录 0. 引言 1. 内存管理的概念 2. 内存覆盖与内存交换 3. 内存连续分配管理方式 4. 内存非连续分配管理方式 5. 虚拟内存的概念.特征及其实现 6. 请求分页管理方式实现虚拟内存 7. 页面置换算法 8. 页面分配策略 9. 页面抖动和工作集 0. 引言 在安全攻防产品的研发中,我们会大量用到cache的机制.在学习和使用cache缓存的时候,经常会遇到cache的更新和替换的问题,如何有效对cache进行清理.替换,同时要保证cache在清理后还要保持较高的命中率.通过对比我们

《linux 内核完全剖析》chapter 13 内存管理 (不含swap.c)

内存管理(memory.c 和swap.s 部分) "倒着看" 先看memory management,很明显,前面各种阻力,都是因为涉及内存管理.不先看这个,我估计前面看了也是白看 我估算着理论打基础砸了差不多一个星期的时间在memory management上面了...感觉很有收获,是时候用实践(code)印证理论了! <modern operating system>讲内存管理那一章 http://blog.csdn.net/cinmyheart/article/de

C++中的内存管理

在C++中也是少不了对内存的管理,在C++中只要有new的地方,在写代码的时候都要想着delete. new分配的时堆内存,在函数结束的时候不会自动释放,如果不delete我分配的堆内存,则会造成内存泄露.所以我们要学会内存管理,不要内存泄露.在C++中的内存管理机制和OC中的还不太一样,在OC中的ARC机制会给程序员的内存管理省不少事,但在C++中没有ARC所以我们要自己管理好自己开辟的内存.Java中也有自己相应的内存管理机制,比如JDBC里的获取的各种资源在finally里进行close等

Objective -C Memory Management 内存管理 第一部分

Objective -C Memory Management??内存管理??第一部分 Memory management is part of a more general problem in programming called resource management. 内存管理是资源管理的一部分. Every computer system has finite resources for your program to use. These include memory, open fi