[iOS7的一些总结]5、iOS中的内存管理 我们知道,为了更加方便地处理内存管理问题,将开发人员从繁琐的内存的分配和释放工作中解放出来而专注于产品和逻辑,iOS提供了一种有效的方法, 即自动引用计数ARC。采用了ARC之后,绝大部分内存管理的问题就不需要我们继续操心了。但是从另一个方面讲,这个方便的工具也助长了程序员的懒惰情 绪,很多新手和学生甚至连引用计数的含义都不清楚。的确,这部分内容相对比较难以理解,不过如果能深刻地领悟之后将会是未来学习和开发中的强大助推器。 1、关于对象所有权的概念: 当一个所有者(可以是任意的objective-c对象)进行以下操作时,它就对某个对象拥有了所有权:创建或复制了某个对象,以及将对象保留使用。可能涉及到的函数有: 1 alloc; allocWithZone; copy; copyWithZone; mutableCopy; mutableCopyWithZone; retain; 如果某个所有者拥有某个对象的所有权,那么该所有者有义务在适当的时刻释放该对象: release; autorelease; 在什么时候需要着重考虑对象所有权?例如,某个对象(对象A)是另一个对象(对象B)的成员,而且子对象(A)与某个外部对象有关(比如通过外部对象对子对象进行设置)。此时需要着重考虑子对象创建和释放的逻辑,防止出现提前释放、误释放和未释放等问题。 2、dealloc方法 作用:在引用计数为0的时候由系统自动调用,释放当前对象并回收内存。通常重写该函数以实现手动施放该对象中手动分配的成员。需要注意的是,由于子类的某些实例继承自父类,因此在最后必须要调用父类的dealloc方法。 3、点语法的内存管理 在定义属性property的时候通常会指定类型,如retain、assign等。主要考虑三个部分: (1)赋值特性:assign——直接赋值(default);retain——保留对象,二者指向同一实例,引用计数+1;copy——拷贝对象,引用计数不变(少数情况下等价于retain); (2)读写性:readwrite——可读写(default),生成setter和getter方法;readonly——只生成getter方法; (3)原子性:atomic——原子类(default),开启多线程保护;nonatomic——非原子类,不存在线程保护。 定义了property后,在使用点语法进行设置和读取成员变量的时候会自动根据定义的类型进行相应的内存操作。 4、自动释放池autorelease pool 在一个自动释放池中创建的对象,可以被自动释放。NSObject类提供了autorelease消息,向某个对象发送autorelease就可以将该对象加入自动释放池。在自动释放池销毁的时候,会自动向池中的每一个对象发送一条release消息。 需要注意的一点是,自动释放池并不能保证每一个池中的对象都成功施放。因为如果池中的对象引用计数大于1,则由于自动释放池仅会发送一条release消息,因此该对象依然会存在。