oc中的内存管理

•所谓内存管理, 就是对内存进行管理, 涉及的操作有:

分配内存 : 比如创建一个对象, 会增加内存占用

清除内存 : 比如销毁一个对象, 能减小内存占用

•内存管理的管理范围

任何继承了NSObject的对象

对其他非对象类型无效(int、char、float、double、struct、enum等 )

•只有OC对象才需要进行内存管理的本质原因

OC对象存放于堆里面

非OC对象一般放在栈里面(栈内存会被系统自动回收)

•系统是如何判断 什么时候需要回收一个对象所占用的内存?

根据对象的引用计数器

•什么是引用计数器

每个OC对象都有自己的引用计数器

它是一个整数

从字面上, 可以理解为”对象被引用的次数”

也可以理解为: 它表示有多少人正在用这个对象

•要想管理对象占用的内存, 就得学会操作对象的引用计数器

•引用计数器的常见操作

给对象发送一条retain消息, 可以使引用计数器值+1(retain方法返回对象本身)

给对象发送一条release消息, 可以使引用计数器值-1

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

•苹果官方规定的内存管理原则

谁创建谁release : 如果你通过alloc、new或[mutable]copy来创建一个对象,那么你必须调用release或autorelease

谁retain谁release :只要你调用了retain,就必须调用一次release

•总结一下就是

有加就有减

曾经让对象的计数器+1,就必须在最后让对象计数器-1

•autorelease方法的基本作用

给对象发送一条autorelease消息, 会将对象放到一个自动释放池中

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

会返回对象本身

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

时间: 2024-10-27 07:14:08

oc中的内存管理的相关文章

关于OC中得内存管理问题,alloc,retain,release,copy,dealloc

我们都知道,一个手机,它的内存是有限的,而每一个手机应用都是需要一定空间,当应用所占空间过大时,系统就会发出警告,怎样在有限的空间中,做到更高效实用美观的效果呢? 这时候就牵涉到OC中得内存管理了. 在OC这门语言中,是不存在垃圾回收机制的,但是它采用了另外一种形式或者说方法,实现这一个空间回收的效果,那就是引用计数器. 别看-引用计数器,这个名字很高大上,实际是它就是一个整数. 所以OC中分配4个字节才存储它. 引用计数的值只有两种:0和非0,我们知道,计算机其实是很笨的,结果只有这两种时,它

IOS阶段学习第20天笔记(OC中的内存管理)

IOS学习(OC语言)知识点整理 一.OC中的内存管理 1)概念:内存管理的对象为所有继承了NSObject的对象,对基本数据(如:int .float.double...)无效      OC中采用引用计数器对内存做管理,他是一个整数数据,表示对象引用的次数,每个对象分配4字节      的内存空间存放引用计数器.当一个对象的引用计数器为0时 它将被自动释放,反过来说 当使用alloc.      new .copy(mutableCopy)创建新对象时,引用计数器默认为1 2)黄金法则 当使

黑马程序员--Objective-C之--OC中的内存管理

对于面向对象的变成语言,程序需要不断地创建对象. 初始,创建的所有程序通常都有指针指向它,程序可能需要访问这些对象的实例变量或调用这些对象的方法,随着程序的不断执行,程序再次创建了一些新的对象, 而那些老的对象已经不会再被调用,也不再有指针指向他们,如果程序没有回收他们占用的内存,就会出现内存泄露. 如果程序一直泄露内存,那么可用内存就会越来越少,直到没有足够的内存,程序將会崩溃.目前,主要有两种管理内存的技术,一是引用计数,二是垃圾回收. iOS平台目前只支持引用计数,Mac平台支持垃圾回收.

OC中的内存管理01

一.内存管理要遵循的原则 1> 谁创建,谁release (看到 alloc.copy.new就应该有写release的冲动). 2> 谁retain,谁release (简单的来说就是要负责嘛,不能retain后不管了). 3> 说明下苹果在这方面做的很严谨,后面的学习会接触到ARC,Xcode会帮我们自动管理相应的内存. 二.基本原理 1> 每个对象的内部都封装的一个与之相关的整数,称之为引用计数器. 2> 当使用alloc.new或者copy创建对象时,计数器被设置为1

OC中的内存管理02

四.自动释放池 (autorelease) 1)基本原理: 1> 自动释放池是OC里面一种内存管理的自动回收机制,一般可以将临时变量添加到自动释放池中,统一回收释放. 2> 当自动释放池销毁的时候,在自动释放池中所有的对象都会调用一次release方法. 3> OC对象只要发送一条autorelease消息,会把对象方法放在最近的释放池中(栈顶的释放池). 4> autorelease实际上是延迟了release方法的调用,每一次autorelease就会把对象放在当前的autor

iOS学习第四天杂记--Objective-C中的内存管理

先说明下,原文为青玉伏案写的.我这只是学习而已. OC中的内存管理. OC中使用引用计数和垃圾回收来管理内存,在OC中为每个对象分配一个引用计数器,当对象刚刚被创建时其初始值为1,当有某段代码需要访问一个对象时,会将该对象的引用计数器加1(通过retain来实现):当访问一个对象结束时,会将该对象的引用计数器减1(通过release来实现):当计数器为0时,该对象占用的内存空间会被收回.在NSObject类有一个retainCount方法,调用该方法可获取当前对象的引用计数值. Tips:测试时

Unity游戏开发中的内存管理_资料

内存是手游的硬伤——Unity游戏Mono内存管理及泄漏http://wetest.qq.com/lab/view/135.html 深入浅出再谈Unity内存泄漏http://wetest.qq.com/lab/view/150.html 这一次,我优化了37%的内存http://wetest.qq.com/lab/view/147.html Unity项目资源加载与管理http://wetest.qq.com/lab/view/124.html Android应用内存泄露分析.改善经验总结h

C++中的内存管理

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

OC - 浅谈内存管理

今天看到一篇不错的文章关于OC内存管理的,转载一下与你共享 概述我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存.其他高级语言如C#.Java都是通过垃圾回收来(GC)解决这个问题的,但在OjbC中并没有类似的垃圾回收机制,因此它的内存管理就需要由开发人员手动维护.今天将着重介绍ObjC内存管理: 1 引用计数器 2