黑马程序员_IOS开发_Objective-C学习笔记_内存管理

1.内存管理概述

1.1什么是内存管理:内存管理是程序设计中常用的资源管理的一部分,每个计算机系统可供程序使用的内存都是有限的。

1.2为什么要使用内存管理:当我们的程序运行结束的时候,操作系统将回收其我们程序占用内存。但是,只要程序还在运行,它就会一直占用内存。如果不进行及时清理不用的内存,内存最终将被耗尽。每个程序都会使用内存,我们必须确保在需要的时候分配内存,而在程序运行结束时释放占用的内存。如果我们只分配而不释放内存,将发生内存泄漏。

1.3引用计数
1.3.1只有当你对一个对象了alloc,copy或retain等操作以后,你才拥有它的引用。
1.3.2当你不需要这个对象时,你应当释放你对他的引用。
1.3.3你不可以对你没有引用的对象执行释放操作。

IOS一旦出现内存不足的情况,ios平台会通知所有已经运行的APP,不论是前台APP还是后台挂起的APP,都会收到 memory warning 的notice 一旦APP收到 memory waring 的 notice 就应该回收占用内存较大的变量。

1.4 内存警报处理
1、程序收到系统发来 memory waring
2、程序释放占用较大的内存。
3、系统回收此程序所创建的atutorelease的对象。

2.内存管理

2.1手工引用计数和自动释放池
手工管理内存的范围:任何继承了NSObject 的对象,并且使用了alloc、copy、mutableCopy和New为前缀的方法创建的对象都不会被自动释放,则需要进行手动管理。

引用计数:对象被创建的时候默认带有4个自己的引用计数器,并且默认的值为1,当引用计数的值为0的时候,对象将被系统销毁。

获取引用计数:给对象发送 retainCount消息获得当前的引用计数,返回值是无符号长整型,可以使用如下语句打印:

NSLog(@“%zi”,[person retainCount]);

获得引用
alloc:为一个新对象分配内存,并将它的引用计数置为1.调用alloc方法你便拥有了新对象的所有权。

retain:是对象的引用计数+1,并获得对象的引用。

释放引用
release:是对象的引用计数减1。

autorelease:是对象的引用计数在未来的某个时候减1,而当前引用计数并没有变。

当引用计数为0的时候,系统则会自动调用继承自NSObject的 dealloc 方法,释放所内存,然后为了能够释放由对象创建或保持的实例变量或者其他对象,需要复写Dealloc方法,但是不建议直接调用dealloc方法,因为这个是由系统进行调用的。

内存管理原则
*谁创建,谁释放,如果你通过alloc、new或copy来创建一个对象,那么你必须调用release或autorelease。
*一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease。
*谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release。

时间: 2024-10-01 07:45:16

黑马程序员_IOS开发_Objective-C学习笔记_内存管理的相关文章

黑马程序员_JAVA UDP网络编程学习笔记

一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的,它们构成了两个端点之间的虚拟通信链路.与TCP通信不同,UDP是面向无连接的.不可靠的基于数据包的传输协议.即应用进程(或程序)在使用UDP协议之前,不必先建立连接.自然,发送数据结束时也没有连接需要释放.因此,减少了开销和发送数据之前的延时.UDP也采用端口来区分进程. 在java中,java.

Objective-C学习笔记_内存管理(一)

一.内存管理的?式 大家都去过图书馆,而图书馆里的书是可以借出的.我们来设想这样一个场景,大家都去借书,但是从来没有人去还书,那么最后,这个图书馆会因为无书可借而倒闭,每个人都没法再使用图书馆.计算机也是这样,当程序运行结束时,操作系统将回收其占用的资源.但是,只要程序运行就会占用资源,如果不进行清理已经不用的资源,资源最终将被耗尽,程序将崩溃. 学会内存管理我们就明白什么时候由你释放对象,什么时候你不能释放.C语言中通过malloc.calloc.realloc和free搭配对内存进行管理.但

黑马程序员_IOS开发_Objective-C学习笔记_类(对象)

1.面向对象编程基本介绍: 面向对象程序设计(英语:Object-oriented programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发的方法.对象指的是类的集合,类是对象的模板,它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的安全性.重用性.灵活性和扩展性. 2.面向对象与面向过程 面向过程就是分析出解决问题所需要的步骤,然后基于这些步骤用代码和函数把这些步骤一步一步实现. 面向对象是把构成问题事务分解成各个对象,然后各个对象分别对相关的程序功能做出处

黑马程序员_IOS开发_Objective-C学习笔记_基本数据类型

 1.数据类型和常量: 我们在做IOS程序开发的时候使用的最多的恐怕就是基本数据类型,在Objective-c中提供了4种基本的数据类型:int float double以及char. 1.1声明为int的变量只能用于保存整形值. 1.2声明为float类型的变量可存储浮点类型值(即包含小数位数).. 1.3double类型和float类型一样,只不过前者的精度大约是后者的2倍. 1.4最后是char 数据类型,char类型可用来存储单个字符,例如字母a,数字6,或是一个分号.或者通过char指

黑马程序员_IOS开发_Objective-C学习笔记_NSString

NSString NSString是一个IOS OC开发中经常使用到得一个对象类型.NSString是NSObject(Foundation的基础对象)的子类,所以具有NSObject的所有特性. NS是Cocoa类对象类型的前缀,来源于乔布斯公司的操作系统的名字 NEXTSTEP 1.创建NSString对象1.1此方法不需要手动释放内存. NSString *aString = @"This is String"; //注意:这里和C语言字符串不一样,需要在头部放一个@符号 1.2

黑马程序员_IOS开发_Objective-C学习笔记_分析和调试自己的一个黑马基础测试题程序

1.程序 1.1程序介绍 从键盘输入6个字符串(仅仅包含英文字母和数字),对着6个字符串从小到大排列并输出结果.(C语言) 1.2程序设计分析 这个是我在基础测试题目环节从黑马报名系统里面下得题目. 初看题目,觉得此题不难,无非是: *建立一个字符串的数组 *然后在一个循环6次的循环体里面循环输入6次,然后再把输入的字符串放到字符串数组里面 *然后建立一个长度数组来统计相对应的字符串的长度 *最后对长度数组中的元素按大小来排序(注意:对长度数组中的元素排序的时候,同时要对字符串数组进行一样的操作

黑马程序员_IOS开发_Objective-C学习笔记_Foundation框架常用的结构体

1.Foundation框架简介 1.1使用Foundation可以: *创建和管理集合,比如数组和字典 *访问存储在应用程序里的图片和其它资源 *创建和管理字符串 *提交和接收通知 *创建日期和时间对象 *自动发现IP网络上的设备 *操作URL流 *执行异步代码 注意:Foundation框架是默认导入的 所以不用刻意去导入 是必备的框架之一 1.2Foundation框架中一些经常接触到的结构体 由于Objective-C程序中 对象的结构体成员变量中的元素 不能通过对象直接来访问 所以我们

黑马程序员_IOS开发_Objective-C学习笔记_继承和分类

1.什么是继承 继承是面向对象程序的三大特征之一,意思是基于一个类的基础,定义一个新类. 被继承的类成为父类,新类成为子类. 继承的实际例子有许多.例如,一个儿子继承了他父亲,那么他就继承了他父亲的财产. 例如基类是Person,那么我们可以继承Person这个类,产生新的子类Student,Teacher 在这里Person是Student类和Teacher类的父类. 引入继承的概念是有许多好处的: *能够抽取重复代码 *建立了类和类之间的联系 *不改变原来模型的基础上,能够扩展出新的方法 2

黑马程序员_IOS开发_Objective-C学习笔记_指针复习

1.指针 上一篇我在分析我自己写的程序错误里面发现是指针的问题,我觉得有必要在复习一下指针,毕竟指针是C语言系列的难点. 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移对指针的概念和使用越加模糊,感觉指针难以掌握,今天我就再回顾下指针的概念和使用. 2.什么是指针 指针的本质是存放变量地址的变量,简单的说变量p中存储的是变量a的地址,那么p就可以称为是变量a的指针,或者说p指向a.当我们访问a变量的时候其实是程序先根据a取得a对应的地址,再到这个地址对