黑马程序员——OC的内存管理学习小结
内存管理在Objective-C中的重要性就像指针在C语言中的重要程序一样。
虽然作为一门高级语言,但OC却没有内存回收机制。这就需要开发者来对动态内存进行管理。OC中内存管理的范围是:任何继承了NSObjective的对象,对基本数据类型是无效的。这和它的管理原理有关。
每个对象内部都保存了一个与之关联的整数,称为引用计数器,当使用alloc、new、或copy创建一个对象时,对象的引用计数器被设置为1.给对象发送一条retain信息,可以使引用计数器的值加1,给对象发送一条release信息,可以使引用计数器值减1.当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存将被系统回收,OC也会自动向对象发一条dealloc消息。一般情况下开发者会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法。要注意的是要重写dealloc方法时要在实现里最后调用
[super dealloc]方法。若重复使用release释放某块内存,可能会发生野指针错误,即使用一个指向僵尸对象的指针进行操作,这样是危险的。
一般来说内存管理有这样的一个原则:谁创建谁释放(”谁污染,谁治理“)。如果你通过alloc、new或(mutable)copy来创建一个对象,那么你必须调用 release或autorelease来释放该内存空间,还有就是不是你创建的,就不用你去释放。一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease,放进autoreleasepool里就行了。换句话说,谁retain,谁release。只要你调用了retain无论这个对象是如何生成的你都要调用release释放。
关于自动释放池autorelease pool。是OC中一种内存自动回收机制,一般可以将一些临时变量添加到自动释放池中统一回收释放。当自动释放池销毁时,池里的所有对象都会调用一次release方法,这里要注意的是,调用一次release方法的是指计数器值将减1,并不一定回收内存;OC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中,即栈顶的释放池。实际上autorelease只是把对release的调用延迟了,对于每一次调用,系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时该pool中的所有对象会被调用release。
Autorelease pool要注意的是,在ARC下不能使用[[NSAutoreleasePool alloc] init]而应当用@autoreleasepool。不要把大量循环操作放到同一个NSAutoreleasePool之间这样会造成内存峰值上升。尽量避免对大内存使用该方法,对于这种延迟释放机制,还是尽量少用。sdk中一般利用静态方法创建并返回的对象都是已经autorelease的不需要进行release操作。
黑马程序员——OC的内存管理学习小结的更多相关文章
- 黑马程序员——OC语言 内存管理
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)计数器 每个对象内部都保存了一个与之相关联的整数,称为引用计数器,当 ...
- 黑马程序员_ Objective-c 内存管理笔记
引用计数器 当一个对象被创建出来,就要分配给内存这个对象,当不用这个对象的时候,就要及时的回收,为了可以明确知道对象有没有被使用,就要用引用计数器来体现,只要计数器不为0,表明对象被使用中. 1.方法 ...
- 黑马程序员:轻松精通Java学习路线连载1-基础篇!
编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...
- 黑马程序员——OC基础 三种特性之封装
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) 三种特性之一封装 (一)set方法和get方法 1) set方法 1&g ...
- 黑马程序员——OC语言基础语法 面向对象的思想
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结)(一)基础语法 1)关键字 @interface.@implementati ...
- 黑马程序员——OC语言 核心语法(2)
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)id 1)简介:万能指针,能指向任何OC对象,相当于NSObject ...
- 黑马程序员——OC语言 类和对象
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)类 1)类的声明 代码编写 ①定义一个Car类,拥有2个属性:轮子数 ...
- 黑马程序员——OC语言 核心语法 (3)
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)分类Category 1) 基本用途 如何在不改变原来类模型的前提下 ...
- 黑马程序员——OC语言 三大特性之多态
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) 三大特性之一的多态 (一)多态的基本概念 OC对象具有多态性体现在 Per ...
随机推荐
- python list删除元素 del remove
L=[5,4,3,2,1,'abc'] del 按照index删除比如: del L[i] del L[i:j] remove按照内容删除 L.remove('abc') L.remove(0)#会报 ...
- 常用Linux命令小结
常用Linux命令小结 Linux下有很多常用的很有用的命令,这种命令用的多了就熟了,对于我来说,如果长时间没有用的话,就容易忘记.当然,可以到时候用man命令查看帮助,但是,到时候查找的话未免有些临 ...
- Oracle PO - 模块一揽子采购协议小结
本文总结oracle ebs采购订单(po)模块一揽子采购协议的相关知识,总结如下: 1.理论介绍 (1)名词术语 一揽子采购协议(Blanket Purchase Agreement,BPA)是指某 ...
- leetcode:Rectangle Area
Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...
- 基于Linux的oracle数据库管理 part1( 准备及linux基础 )
主要内容 1. 安装VMware tools (好处, 显示效果增强, 从虚拟机出来不需要alt+ctrl 切换) 2. Linux 启动过程, 方便以后oracle 自动启动与关闭 3. Linux ...
- tuning 02 Diagnostic and Tuning Tools
statspack 是一个很重要的工具, 这是我们重点要知道的在这章 每天一上班就要看一下 alert log 文件, 可以通过/ORA找, 这是vi的知识,所有的ORACLE错误都是以ORA开头的 ...
- 非常非常好!写了好久 k-th-smallest-in-lexicographical-order
https://leetcode.com/problems/k-th-smallest-in-lexicographical-order/ 我没做出来.还是脑子不够清醒. 下面这个解法真的很棒很棒. ...
- Git基础(一)
本系列内容主要介绍Git一些基本的也是最常用的命令,相信读完本系列内容后,你也差不多能够上手Git了.读完本系列,你就能初始化一个新的代码仓库,做一些适当配置:开始或停止跟踪某些文件:暂存或提交某些更 ...
- noi2015的回忆和教训
前几天偶然打开了bzoj的rank list,突然发现——我竟然掉出了第一版!!! 自从我5月还是6月刷进第一版之后,我曾经天真的以为大概半年之内我还能保留在第一版内吧. 结果仅仅短短的4个月,我就已 ...
- hdu 1226 超级密码(bfs+余数判重)
题意:略过 分析:用m个数字组成一个能够被n整除的c进制数的最小值,实际上本题的关键就在于这个最小值上. 首先确定我们的思路是从小到大寻找.先查看一位数,即查看着m个数字是否能被n整除:若不能,就查 ...