OC加强(一)之内存管理

1.为什么要进行内存管理?

由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存 较多时,系统就会发出内存警告,一个app可用的内存是被限制的,如果一个app使用的内存超 过20M,则系统会向该app发送Memory Warning消息。收到此消息后,需要回收一些不需要再 继续使用的内存空间,比如回收一些不再使用的对象和变量等,否则程序会崩溃。

这里首先要解释一个常识概念:内存,存储空间,各自的功能?

内存:我们一般说的手机内存其实是指运行内存,,简称运存,即 RAM-全称是RamdomAccessMemory:随机存取存储器

RAM 的大小直接决定手机后台能开多少程序,能运行多少软件,RAM越大,就表示可以运行的软件就越多

存储空间:存储空间就是下载的软件或各种文件的容器,即ROM-全称是Read Only Memory:只读存储器

ROM的大小决定了手机能装多少软件存多少文件,歌曲,电影,小说等..

所以我们知道,手机内存是很小的,一个APP运行如果占用过多内存,苹果规定如果单个APP运行内存超过20M,就会报内存警告,所以必须对内存进行管理,否则会引起程序崩溃

软件被强制闪退,关闭

2.OC 内存管理的范围:

OC管理所有继承自NSObject类的对象,不去管理其他基本数据类型的对象,(只针对堆区)

为什么?

本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于 栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指 向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄 露。

通俗讲就是:栈区存的是一些基本类型的局部变量,指针变量也是局部变量,这些变量在程序结束会自动被系统回收,

但堆区是不会被系统管理的,如果我们也不去管理,就像永远不清理的垃圾,越来越多,占着内存空间,就相当于你有100块钱,被偷了50块,也就是内存泄漏的概念了

这里又想到一个小的概念:

为什么定义堆区时说堆区是程序运行过程中动态分配的内存空间?

可以想一下,堆区是存储对象的,而只有创建对象时调用类方法alloc时才会在堆区申请内存空间,所以显而易见堆区就是只有当实例化对象时才会被分配内存空间

显而易见:定义油然而生

3.内存管理的原理和分类:

3.1引用计数器

引用计数器是一个整数,是用来计算对象被引用的次数的

对象创建时向计算机申请了一块内存空间,并在这一块内存空间中分出了一个8个字节的空间用来存放引用计数器

3.2对引用计数器的操作

给对象发送消息,进行相应的计数器操作。

retain消息:使计数器+1,该方法返回对象本身

release消息:使计数器-1(并不代表释放对象)

retainCount消息:获得对象当前的引用计数器值%lu %tu

作用就是给对象发消息(每天干的活)

又想到一个小概念:

我们玩苹果手机时通常会按home键,让程序"看似退出",但实际上程序只是放在后台运行了,并没有退出,怎么看到后台程序呢?双击home键即可看到

所以程序退出(双击home键,按住应用程序往上滑),但有个问题微信,qq,我让程序退出后还是能够接受消息,这是不是说明程序在后台是运行着呢?并

没有退出,但我明明已经双击home把程序滑退了啊,这个怎么解释呢?

其实,程序确实是退出了,这些消息其实就是推送消息,而推送消息是由苹果的服务器推送给你的,并不是APP推送的,(这项技术成为手机推送开发技术)

应该是涉及服务器和数据库的,这也是学习iOS的弊端,好多都不能深入了解,要想清楚,还是要往全栈上发展和努力.

Objective-C提供了三种内存管理方式:

MannulReference Counting(MRC,手动管理,在开发 iOS4.1之前的版本的项目时我们要

自己负责使用引用计数来管理内存,比如要手动 retain、release、autorelease 等,而在其后
的版本可以使用 ARC,让系统自己管理内存。)

automatic reference counting(ARC,自动引用计数,iOS4.1 之后推出的)

garbage collection(垃圾回收)。iOS不支持垃圾回收;
ARC作为苹果新提供的技术,苹果推荐开发者使用ARC技术来管理内存;

开发中如何使用:需要理解MRC,但实际使用时尽量用ARC

4.MRC(手动内存管理)

时间: 2024-08-27 22:15:18

OC加强(一)之内存管理的相关文章

OC基础 05-手动内存管理(MRC)

---恢复内容开始--- MRC: Manul(手动) Reference(引用) Counting(计数) 什么是手动引用计数? 所有对象的内容都需要我们手动管理, 需要程序员自己编写release/retain等代码 内存管理的原则就是有加就有减 也就是说, 一次alloc/new/copy对应一次release, 一次retain对应一次relese 内存管理的重要性: 移动设备的内存极其有限,每个app的占用内存也是有限制的. 当我们创建一个OC对象,定义一个变量,调用一个函数或者方法,

黑马程序员---OC基础6【内存管理】【手动内存管理】【单、多个对象的内存管理】【*@property参数】【@class的使用】【NSString类的内存管理】【autorelease使用】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [内存管理] 1.内存管理概念 由于移动设备内存及其有限,所以每个app所占的内存也是有限的 需要回收一些不使用的空间 2.OC内存管理的范围 管理任何继承NSOject的对象,对其他的基本数据类型无效 主要管理堆区中的对象的内存管理   3.内存管理的原理 1)对象所有权概念 任何对象都可以能拥有一个或多个所有者,只要一个对象至少还拥有一个所有者,他就会继续存在 cocoasu所有权策略 任何自

七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 [email protected]参数 [email protected]和循环retain的使用 6.NSString的内存管理

1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程序闪退. 2.OC内存管理的范围 : 管理任何继承NSObject的对象,对其他的基本数据类型无效. 3.对象类型是程序运行过程中动态分配的,存储在堆区:内存管理主要是对 堆区中的对象的内存管理. 4.OC内存管理的原理 为了防止内存泄露 对象的引用计数器 : 每个OC对象都有自己的引用计数器,是一

OC学习总结4 内存管理

内存管理 基本数据类型(int,float,double,char,struct,enum)的数据内存不需要内存管理 1 对象的内存管理 诞生 alloc或new或copy 生存 接收消息和执行操作 交友 借助方法的组合和参数,调用方法 销毁 内存被释放 delloc:相当于被释放内存的临终遗言,每个内存被销毁之前都会调用dealloc方法 2 引用计数 1 Cocoa采用引用计数也叫作保留计数 2 alloc new copy 用这三个方法创建对象时,对象的引用计数器为1 3 retain 给

23-黑马程序员------OC 语言学习笔记---内存管理

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 对于面向对象的变成语言,程序需要不断地创建对象.初始,创建的所有程序通常都有指针指向它,程序可能需要访问这些对象的实例变量或调用这些对象的方法,随着程序的不断执行,程序再次创建了一些新的对象,而那些老的对象已经不会再被调用,也不

OC系列高级-内存管理关键字

一.MRC中@property关键字 1.assign,retain,copy 这几个关键字用语setter方法的内存管理 assign:一般用于非oc对象,直接自信赋值操作 retain:一般用于oc对象,那么将retain新值,release旧值 copy:将release旧值,copy新值 一般默认是assign 2.nonatomic和atomic 这两个关键字用语多线程管理,nontomic性能高,atomic性能低,不显示使用以atomic为默认值 3.readwrite和reado

【OC基础】03-OC内存管理

概述 跟Java和C#类似,OC创建的对象在堆上.与Java和C#不同的是Java和C#有垃圾回收机制,所以不需要程序员手动释放堆上的内存.而OC没有垃圾回收机制,必须手动管理内存的创建和释放.下面介绍一下OC内存管理内存管理的方式. 引用计数器 OC管理内存的方式类似C++中的智能指针,创建一个对象时,在ObjC中每个对象内部都有一个与之对应的整数(retainCount),叫“引用计数器”,当一个对象在创建之后初始化它的引用计数器为1,当调用这个对象的alloc.retain.new.cop

OC学习篇之---内存管理介绍和使用

在之前的一片文章我们说了OC中谓词操作:http://blog.csdn.net/jiangwei0910410003/article/details/41923507,从今天开始我们就来看一下OC中最难的一部分内容:内存管理 为什么说他难呢?因为内存如果需要我们程序员去管理的话,那个难度肯定是很大的,如果是Java,垃圾回收器会把这份工作给做了,我们不需要关心,但是就是因为如此,Android运行速度上会慢一下,原因很简单,Java的垃圾回收器有很多收集算法的,这个在回收的过程中是很浪费时间的

OC第七节——内存管理

戏言: iOS开发已经到了一个ARC时代,一般不需要我们过多的去关注内存是怎么分配,怎么管理的.很长一段时间,我也不知道内存管理是什么鬼,但如果遇到这方面的问题,却找不到解决办法确实很头疼的.So,还是静下心来,好好学习吧,毕竟内功才是体现水平. 1. 引用计数            对于一块动态申请的内存,有一个人(指针)使用,就给这个内存的计数器加1,使用完成后,就给这个计数器减1,当这个内存的引用计数为0了,我们再释放他,这样,上面的问题就解决了.OC,就是使用引用计数这种方式来管理内存的