zoukankan      html  css  js  c++  java
  • 【ios开发】UITableViewCell的重用

    移动开发需要解决的一个问题就是资源稀缺的问题。多数情况下是内存问题。

    虽然现在的手机都号称大内存,高配置。但是移动app所占用的资源也在跟着不断膨胀,

    也是造成内存不足的主要原因。

    在前面的例子中,还记得我们是怎样创建UITableView的cell的吗?

    如果不记得,没有关系,请看下面的代码:

     

    在这个方法调用过程中,每次都会实例化一个UITableViewCell,一个cell代表一个内存地址。

    当数据量不是很大的情况下,问题不是很明显。但是如果数据很多的话,那么这个方法在实例化cell的时候就会申请大量的内存,

    以满足程序的正常运行。

    假如我们有100条数据,那么程序要显示完这100条数据的话,就要向系统申请100个内存地址。

    但是如果我们把TableView从顶部滚动到底部,然后再从底部滚回到顶部,内存地址的需求就变为200个。

    因为我们都知道,屏幕上每显示一行数据,tableView: cellForRowAtIndexPath:方法就被调用一次。

    每次调用都会重新分配内存,这显然不是一个好的实现。apple作为一个非常重视用户体验的公司,不可能不会发觉这个问题的。

    UITableViewCell的重用

    原理:假如屏幕最多能显示10条数据,当第一次启动程序,这10个内存地址一次分配完成,然后我们向下滚动TableView,

    当第一行cell超出屏幕范围不可见后,这个cell所占的地址就可以被重用。如果还不明白的请看下图。

    小声的说一下,andriod开发中listview的优化跟ios中UITableView思想基本一样。

     

    TableView提供了下面的方法帮我们达到重用cell的目的:

    - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier

    UITableView内部维护了一个可重用cell的队列,使用上面的方法,我们可以在该队列中取出可重用的cell。
    但是只有当队列中有数据时这个方法才返回UITableViewCell的实例,否则返回nil。因此我们要确保cell被成功初始化。

    下面我们重新改造cellForRowAtIndexPath方法



    在viewDidLoad方法中添加下面的代码,该方法能确保
    cellForRowAtIndexPath方法中返回的cell不为nil


    最后说明一下这个reuseIdentifier的作用,当我们的界面中有多个TableView的时候,
    这几个TableView中的cell类型不一定相同,那么就可以使用它来标识我们重用的是哪一种类型的cell。
    下面是代码中reuseIdentifier的定义:

  • 相关阅读:
    ASP.NET MVC应用程序更新相关数据
    HTML5 教程
    Nginx+Tomcat+Keepalived+Memcache 负载均衡动静分离技术
    Bootstrap 模态框
    Routing(路由) & Multiple Views(多个视图) step 7
    构建日均千万PV Web站点1
    基础模块
    Visual Studio 换颜色
    动手实现Expression翻译器1
    ASP.NET SignalR 2.0入门指南
  • 原文地址:https://www.cnblogs.com/ai-developers/p/4562311.html
Copyright © 2011-2022 走看看