黑马程序员——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 ...
随机推荐
- What is Entity Framework?
1.什么是EntityFramework? http://www.entityframeworktutorial.net/what-is-entityframework.aspx Writing an ...
- 浅析JavaScript引用类型之--Object、Array
1.Object类型 对象是某个特定引用类型的实例,新对象有两种创建方式: i.使用new操作符调用构造函数来创建. var person = new Object(); person.name = ...
- 判断客户浏览器是否支持cookie
function check(){ if(window.navigator.cookieEnabled) return true; else{ alert("浏览器配置错误,Cookie不可 ...
- c#调用系统资源大集合-1
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServi ...
- android漂亮的对话框项目sweet-alert-dialog
漂亮的对话框 sweet-alert-dialog 项目地址: https://github.com/pedant/sweet-alert-dialog android原生的dialog太生硬了, ...
- UVa 575 Skew Binary 歪斜二进制
呵呵,这个翻译还是很直白的嘛,大家意会就好. 第一次看到这个高大上题目还是有点小害怕的,还好题没有做过深的文章. 只要按照规则转化成十进制就好了,而且题目本身也说了最大不超过一个int的范围(2^31 ...
- 51nod1476 括号序列的最小代价
这题应该可以用费用流写吧?不过我想不出贪心来TAT.其实还是单调队列乱搞啊T_T //ÍøÉϵÄ̰ÐÄËã·¨ºÃÉñ°¡¡£¡£¡£ÎÒÖ»»áÓÃ×îС·ÑÓÃ×î´óÁ÷ÅÜTAT #in ...
- ASP.NET 时间方法大全
DateTime dt = DateTime.Now; //当前时间 DateTime startWeek = dt.AddDays(- Convert.ToInt32(dt.DayOfWeek.To ...
- BZOJ 1827 奶牛大集会
树型DP. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm& ...
- Linux技巧:一次删除一百万个文件最快方法
昨天,我看到一个非常有趣的删除一个目录下的海量文件的方法.这个方法来自http://www.quora.com/How-can-someone-rapidly-delete-400-000-files ...