为什么要进行内存管理?
答:因为系统可供程序使用的资源都是有限的,这些西苑包括内存,打开文件数量,以及网络连接等。程序运行的时候,程序会一直占用资源,不进行清理,资源将会耗尽,程序将可能崩溃.
内存管理机制?
cocoa采用了一种称为引用计数器的技术。每个对象都有和他相关联的整数,当某段代码需要访问一个对象时,该代码将该对象的引用计数器的值加1,当这段代码结束时,讲该对象的引用计数器减一,表示他不再访问这个对象,当引用计数器的值为0时,将不再有代码访问该对象,对象被销毁,其占用的内存被系统收回。
1.当使用alloc 、new或者通过copy消息创建一个对象时,对象的引用计数器的值为1,要增加对象的引用计数器的值,可以给对象发送一条retain消息,要减少对象的引用计数器值可以给对象发送一条release消息。
2.当一个对象因为引用计数器为0即将被销毁时间,OC自动向对象发送一条dealloc消息,可以在自己的对象中重写 dealloc的方法,不能直接调用。
自动释放池(NSAutoreleasePool)
是一个存放实体的集合,这些实体可能是对象,能够被自动释放。
NSObject类提供了一个autorelease的方法,该方法预先设定了一条在将来某个时间会发送的release消息,其返回值是接受消息的对象。当自动释放池被销毁的时候,会向该池中的多有对象发送release消息。
自动释放池销毁时间
创建一个自动释放池,该池自动成为活动的池,释放该池时,其引用计数器为0,该池被销毁,在销毁过程中,该池子释放所有包含的对象。
内存管理规则
1.当你使用new,alloc或者copy创建一个对象时,该对象的引用计数器值为1,当你不再使用这个对象时,你要负责向该对象发送一条release或者autorelease消息。这样,对象将在其使用结束时被销毁。
2.当你通过任何一个其他方法获得一个对象时,则假设该对象的保留计数器值为1,而且已经被设置为自动释放,你不需要执行任何操作来确保该对象被清理,如果打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它。
3.如果你保留了某个对象,你需要释放或自动释放对象,必须保持retain和release方法的使用次数相等。
网友评论