IOS 学习笔记14 内存管理(1)

来源:互联网 发布:手机能删除淘宝评价吗 编辑:程序博客网 时间:2024/06/08 12:50

现在搞iphone开发,一直不是很懂object-c的内存管理机制,看到apple的官方文档写的不错而又没有找到翻译的文章。于是自己在学习它的过程中就顺便把它翻译了,自己的英语不是太好,文字组织能力那就更菜了,读的蹩脚之处还望大家指出,我好在以后的翻译过程中好好改正。第一次翻译,欢迎拍砖,可不要把我拍死了呀!!!微笑

文章中带有LPSTUDY的字样表明是我个人的理解,可能会有不对的地方,敬请指教。

文章原文链接地址:

http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/MemoryMgmt/Articles/MemoryMgmt.html#//apple_ref/doc/uid/10000011-SW1

本文博客地址:

http://blog.csdn.net/lipeng08/article/details/7702707

关于内存管理

内存管理指的是你的程序在运行过程中进行内存的分配,使用,以及释放它的过程。一个经过仔细编码的程序总是尽可能使用更少的内存。在object-c中,内存管理也被看作是你对拥有的有限的内存资源进行数据和代码的合理分配的过程。如果你仔细通读了本篇文档,你将能够合理的管理对象的生命周期以及适时的释放不再被程序使用的内存。

 

内存管理看起来似乎是单个对象的操作,但实际上我们总是在管理着对象图。

LPSTUDY:

1.    1:Class A中通过调用alloc/init方法创建了一个对象,此处我命名此对象为aObject,此时由于aObject调用了alloc方法,它的引用计数(retain count)是1

2.    在Class B中对aObject进行了retain操作,这样会增加aObject的引用计数,即为2

3.    Class C想要使用aObject,于是它调用了copy操作,这样Class C会拥有aObject的拷贝,这个和retain操作不一样。retain操作仅仅增加了aObject指向的实际内存的引用计数,copy操作是又申请了一块内存, 此内存引用计数为1,通过copy操作,Class C可以自由处理此块内存(这个只有处理是有限制的,受被copy元素的属性限制),将此块内存命名为cObject。

4.    Class A调用了release方法,此时aObject的引用计数减1,变为1

5.    Class B又调用了一次release方法,引用计数为0,此块内存被释放。

6.    Class C对自己cObject调用了release方法,retain减1,变为0,此块内存被释放。

 

概览:

object-c提供了三种内存管理方法

1.    Retain-Release方式:简称MRR,这个需要程序员很清楚的跟踪自己的对象来管理内存,它是通过使用基类NSobject提供的引用计数模型进行管理的。当引用计数为0,此块内存被释放。

2.    自动引用字数方式:简称ARC,它也是使用了同样的引用计数机制,它在编译的时候自动帮你添加了内存管理方法。如果你使用了ARC,很多底层的机制你就无需知道了。

see Transitioning to ARC Release Notes

 3.    垃圾回收:系统自动跟踪对象的依存关系,然后自动释放不再被引用的对象。它使用一个与自动引用计数不同的机制,不过仅仅在Mac Os X中使用,不可以用于IOS。

 see GarbageCollection Programming Guide.

 

如果你想在IOS上编程,你必须使用显式的内存管理(这篇文档的主题),如果更进一步,你计划写一些库,或者插件,或者可在垃圾回收和非垃圾回收的程序中使用的共享代码,你就必须通读本文档以使用内存管理技术。(在xcode中,你必须在使用或者禁用垃圾回收都测试一下你的代码)

 

良好的习惯可以避免内存方面的问题

主要有两种问题导致错误的内存管理

1.    在数据使用的过程中释放或者重写数据。

这可能引起内存崩溃,更典型的如程序崩溃,用户数据出错。

数据不再被使用,仍然不释放内存会导致内存泄露

2.    内存泄露是值你仍然不去释放已经不会再被使用的内存。内存泄露导致你的程序占用内存过多,从而导致系统性能下降或者在IOS中被强制终止。

不要仅仅从引用计数来看内存管理,那样你会陷入实现的细节而脱离你真正的目标。你应该更多的从对象所有者和对象图来考虑内存管理。

Cocoa使用了简单的命名约定来表明你调用的方法返回的对象的内存类型。

See “MemoryManagement Policy.”


虽然比较基本的策略很明确,但同样有一些很实用的步骤可以帮助你更容易的管理内存,从而是你的程序更健壮,更可靠,同时减少内存的实用

See “Practical Memory Management.”

 

自动释放池提供了一种向对象延迟发送释放消息的机制,当你放弃一个对象的所有权而又不想它立刻被释放(例如你向从一个方法中返回一个对象)时,这种机制是非常有用的。有些场合你需要用到对象自动释放池

See “Using Autorelease Pools.”

 

使用代码分析工具来调试内存问题

为了发现你在编译时候的代码问题,你可以使用xcode的use the ClangStatic Analyzer 

 

如果内存管理问题确实发生了,同样有一些工具和技术来检测和查找问题

·     很多的技术工具在Technical Note TN2239,iOSDebugging Magic中被描述,特别是使用NSZombie来帮助你发现over-released 的对象。

·     你也可以使用工具来跟踪引用计数事件来查找内存泄露的问题。See “CollectingData on Your App”.

0 0
原创粉丝点击