一、OC为什么需要进行内存管理
- 每个C语言程序员都会遇到与内存相关的错误,这种错误是灾难性的。而使用Java和脚本语言的程序员则不需要考虑此类问题:这些语言的的内存管理是自动进行的。
- 必须确保在需要的时候分配内存,在程序运行结束时释放占用的内存。如果只分配,而不释放内存,则会发生内存泄露(leak memory):程序的内存占用量不断增加,最终内存会被耗尽,并导致程序崩溃。
- 不要使用任何刚释放的内存,否则可能误用陈旧的数据,从而引发各种错误,而且如果该内存已经加载了其他数据,将会破坏这些新数据。
引申问题:如何分配使用内存,如何防止内存泄露,如何释放被占用的内存
二、对象生命周期
程序中的对象有生命周期。对象的生命周期包括诞生(通过alloc或new方法实现)、生存(接收消息并执行操作)、交友(通过复合以及向方法传递参数)以及最终死去(被释放掉)。当生命周期结束时,它们的原材料(内存)将被回收以供新的对象使用。
引申问题:什么是对象、对象的诞生、如何使用对象
- 1、引用计数
怎么知道对象生命周期结束了呢?Cocoa采用了一种叫做引用计数(reference counting)的技术,有时也叫做保留计数(retain counting)。每个对象都有一个与之相关联的整数,被称作它的引用计数器。当某段代码需要访问一个对象时,该代码就将该对象的引用计数器值加1,表示要访问该对象,当这段代码结束对象访问时,将对象的保留计数器减1,表示它不再访问该对象。当保留计数器的值为0时,表示不再有代码访问该对象了,因此它将被销毁,其占用的内存被系统回收以便重用。
当使用alloc、new方法或者通过copy消息(接收到消息的对象会创建一个自身的副本)创建一个对象时,对象的保留计数器值被设置为1。要增加对象的保留计数器的值,可以给对象发送一条retain消息。要减少的话,可以给对象发送一条release消息。当一个对象因其保留计数器归0而即将被销毁时,Objective-C会自动向对象发送一条dealloc消息。你可以在自己的对象中重写dealloc方法,这样就能释放掉已经分配的全部相关资源。一定不要直接调用dealloc方法,Objective-C会在需要销毁对象时自动调用它。
要获得保留计数器当前的值,可以发送retaincount消息。下面是retain、release、retaincount的方法声明。
-(id)retain;
-(oneway void)release;
-(NSUInteger)retaincount;
增加对象的保留计数器的值并要求对级字,,的高时、以“个、深具关共:i消息的同时进行retain两
Idek:2]:表示要。求他时的等等一,1我5的成k某种操作。例如;[[ar retainl setrib.h
本章的第一个项目是RetaincossearA ehi'ohtt triANTJrsetfire操作。
个ietainrracker类的对象,该对的外封我自 otiCount-1项目文件夹内。以下程序创建了
it erfceRetainracker:N5Object
eend // RetainTracRe"" rwuect
ea的p.tbtentation Retainfracker
(id)init
,self retaincourtiy"t Motog (e"init:Retain count of ani,.
retyrn.(se1f);
【Vhid)dea11oc
Mtog (e"dealloc ca11ed. avo p
d高年nes9Poc ca11ed.Bye lire."),
super dea11oc];