黑马程序员——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 ...
随机推荐
- Highgui.imwrite("/data/pic1111.png", mat)失败,且找不到报错
——> Highgui.imwrite("/data/pic1111.png", mat)失败,且找不到报错. ok -->直接使用以下代码,自己保存mat,从而可以跟 ...
- C# 将字符串转化成流,将流转换成字符串
using System; using System.IO; using System.Text; namespace CSharpConvertString2Stream { class Progr ...
- struts配置。泪奔...
说多了都是泪啊,配置一个环境一天才搞定.不错the requested resource (/login) is not available in struts,就是找不到什么什么class.亦或th ...
- linux学习之centos(一):在VMware虚拟机中安装centos6.5
---安装环境如下--- 虚拟机版本:VMware Workstation_10.0.3(版本信息介绍:VMware-workstation-full-10.0.3-1895310,下载地址:http ...
- Spring Transaction + MyBatis SqlSession事务管理机制[marked]
- 第四讲 :hibernate中的session
hibernate中的session中可以进行增删改差,通过工具类可以得到相关的工具类. 方法概要: Transaction beginTransaction()开始一个工作单元,得到关联的事务对象 ...
- JAVA使用DES加密算法加密解密
程序中使用了.properties文件作为参数配置文档,好处是灵活配置各项参数 一旦对数据库的一些参数进行了配置,势必涉及数据库的IP,端口,用户名和密码 properties文件全是unicode编 ...
- UVa 11137 (完全背包方案数) Ingenuous Cubrency
题意:用13.23……k3这些数加起来组成n,输出总方案数 d(i, j)表示前i个数构成j的方案数则有 d(i, j) = d(i-1, j) + d(i, j - i3) 可以像01背包那样用滚动 ...
- [转载]mysql的binlog安全删除
[转载]mysql的binlog安全删除 理论上,应该在配置文件/etc/my.cnf中加上binlog过期时间的配置项,expire_logs_days = 10 但是如果没有加这一项,随着产生越 ...
- 转:Emmet:快速编写HTML,CSS代码的有力工具
http://www.cnblogs.com/xiazdong/p/3562179.html 试着用用