内存管理在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的内存管理学习小结的更多相关文章

  1. 黑马程序员——OC语言 内存管理

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)计数器 每个对象内部都保存了一个与之相关联的整数,称为引用计数器,当 ...

  2. 黑马程序员_ Objective-c 内存管理笔记

    引用计数器 当一个对象被创建出来,就要分配给内存这个对象,当不用这个对象的时候,就要及时的回收,为了可以明确知道对象有没有被使用,就要用引用计数器来体现,只要计数器不为0,表明对象被使用中. 1.方法 ...

  3. 黑马程序员:轻松精通Java学习路线连载1-基础篇!

    编程语言Java,已经21岁了.从1995年诞生以来,就一直活跃于企业中,名企应用天猫,百度,知乎......都是Java语言编写,就连现在使用广泛的XMind也是Java编写的.Java应用的广泛已 ...

  4. 黑马程序员——OC基础 三种特性之封装

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) 三种特性之一封装 (一)set方法和get方法 1)  set方法 1&g ...

  5. 黑马程序员——OC语言基础语法 面向对象的思想

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结)(一)基础语法 1)关键字 @interface.@implementati ...

  6. 黑马程序员——OC语言 核心语法(2)

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)id 1)简介:万能指针,能指向任何OC对象,相当于NSObject ...

  7. 黑马程序员——OC语言 类和对象

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)类 1)类的声明 代码编写 ①定义一个Car类,拥有2个属性:轮子数 ...

  8. 黑马程序员——OC语言 核心语法 (3)

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)分类Category 1) 基本用途 如何在不改变原来类模型的前提下 ...

  9. 黑马程序员——OC语言 三大特性之多态

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) 三大特性之一的多态 (一)多态的基本概念 OC对象具有多态性体现在 Per ...

随机推荐

  1. Git设置及GitHub的使用

    把github上的help略略翻译一遍.备忘. First : 安装:ubuntu 下,终端输入命令: sudo apt-get install git-core git-gui git-doc Ne ...

  2. LINUX内核分析第四周学习总结——扒开应用系统的三层皮(上)【转】

    转自:http://www.cnblogs.com/lalacindy/p/5276874.html 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://moo ...

  3. linux中/etc/init.d [转]

    一.关于/etc/init.d 如果你使用过linux系统,那么你一定听说过init.d目录.这个目录到底是干嘛的呢?它归根结底只做了一件事情,但这件事情非同小可,是为整个系统做的,因此它非常重要.i ...

  4. sizeof()与strlen()的区别

    首先需要说明的是sizeof和strlen都可以求长度,但是却有很大的区别,简单来说可以概括为以下几点: 1.sizeof是一个关键字,而strlen确实一个函数. 2.sizeof求的是字节长度,而 ...

  5. GitPython git python 的开发库

    工程地址: https://pypi.python.org/pypi/GitPython/需要安装先安装: gitdb https://pypi.python.org/pypi/gitdb GitPy ...

  6. 51nod 1050 循环数组最大子段和 (dp)

    http://www.51nod.com/onlineJudge/questionCode.html#problemId=1050&noticeId=13385 参考:http://blog. ...

  7. dom4j API使用简介

    dom4j API使用简介 功能简介 dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的.dom4j是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极 ...

  8. Android实现分享内容到微信朋友圈

    原文地址:http://yanwushu.sinaapp.com/android_wechat_share/ 由于需求,要实现在应用中实现分享文字+图片到微信朋友圈.在网上找了一些资料,总结如下: 思 ...

  9. @Inject.@Resource.@Autowired 的区别

    @Inject:Struts2的注解, @Resource : J2EE提供,用于注入,( j2ee提供的 ) 默认按名称装配,@Resource(name="beanName") ...

  10. LA 4255 (拓扑排序 并查集) Guess

    设这个序列的前缀和为Si(0 <= i <= n),S0 = 0 每一个符号对应两个前缀和的大小关系,然后根据这个关系拓扑排序一下. 还要注意一下前缀和相等的情况,所以用一个并查集来查询. ...