一、类对象的内存优化

        对于 iOS 开发的程序员来说,内存优化是自始至终都要考虑的一个关键问题,所以这一次咱们来说一下如何优化项目中的内存使用率。在针对内存优化开始前我们必须了解一点:内存在 iOS 开发中所占的位置和意义非常重要。

        iOS 程序员对于内存的概念应该接触较深,在刚开始接触 iOS 开发时,我们应该对于iOS的内存处理机制有过一定的了解。iOS 的内存处理机制为引用计数管理,当我们针对一个类进行实例化时,就是对当前对象在内存空间中申请一个内存地址,用来以后的使用。

        当我们通过 alloc 和 init 的方法实例一个对象后,就已经在内存模块当中申请了一个地址来存放当前对象的内容,此时此对象的引用计数就从 0 变为了 1,当我们针对当前对象进行 copy (此时使用的是浅copy),操作时就是对于当前对象的引用计数 +1。同样,当我们在 dalloc 中执行对象销毁(release)的时候,其核心就是针对当前兑现的引用计数-1,当当前对象的引用计数归 0 时,此时对象所占用的内存地址就回被系统收回。

        所以,针对对象类的内存优化其实就是做好对象的引用计数的管理。不过现在开发大多都是使用的 ARC 模式,都是通过系统内部自有的管理引用计数机制,一般也就用不到自己手动处理对象的引用计数机制。

二、通知(NSNotification)的内存优化

        通知是 iOS 开发当中较为常用的事件或者说数据传输模式,因其限制较小所以会经常出现在很多项目中,但是由于通知的核心概念是通过事件响应,长久保持于内存地址中,并通过轮询(runloop)机制来实时响应事件或传输数据。

        所以通知如果不能被及时释放就会导致内存的使用率持续升高,所以针对通知的使用我们要做到当前类在不需要事件响应时注销通知。

三、TableView的内存优化

        TableView 是 iOS 开发中基础的列表布局视图,由于其特性较于 view 视图来说其页面展示的数据以及页面的布局都要远远复杂与 view 视图,所以 tableView 的优化是非常必要的。

        1.懒加载

        由于 tableView 的核心意义是展示列表布局,所以其承载的视图和数据内容也是大量的,通过使用懒加载的方式来减少无用数据的展示和布局从而减轻 tableView 的内存压力。

        2.cell 重用机制

        在使用 tableView 进行页面布局时,时常会看到相似列表的样式 此时我们就应该用到 cell的重用机制,当视图中展示的 cell 被滑出视图中时,此时的 cell 就会进入重用队列,如果即将出现的下一 cell 的布局样式与此 cell 一致我们就可以不用再次创建新的 cell 直接通过 cell 重用队列中的 cell 来进行视图布局,(此时一定要考虑好cell的展示样式,当如果视图样式不同时切忌使用重用机制)。

        3.数据加载使用异步操作

        总所周知数据加载是最为耗时费力的操作,所以这写数据处理的方式不应该也不允许在主线程上进行操作否则会导致由于数据量过大对主线程造成卡顿,所以数据加载必须使用异步操作,而且由于 tableViewCell 的特殊性,为了能够更大减少内存压力我们大多都是采取当用户滑动停止后 确定当前页面显示的内容行数是才进行数据布局(此时着重指的是图片的加载)。

        4.非必须尽量减少使用reloadData

        tableView 当中的 reloadData 操作是针对当前 tableView 的所有列表进行数据刷新,由于数据量过大会导致资源的严重损耗,所以当需要刷新指定 cell 的时候尽量减少使用 reloadData。

        在非必要刷新全局的时候可以通过指定 section 或者 row 的方法来刷新特定位置的数据。

        刷新指定 section

NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:indexPath.row];

[tableview reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic];

        刷新指定cell

NSIndexPath *indexPath=[NSIndexPath indexPathForRow:3 inSection:0];

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath,nil] withRowAnimation:UITableViewRowAnimationNone];

常用的内存优化已经介绍完毕,针对于多线程的内存优化将放到下一期多线程讲解中。