源码-0203-cell的循环利用01

//
//  ViewController.m
//  01-性能优化
#import "ViewController.h"

@interface ViewController () <UITableViewDataSource>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped];
//    tableView.frame = self.view.bounds;
    tableView.dataSource = self;
    // 行高
    tableView.rowHeight = 70;
    [self.view addSubview:tableView];
}

#pragma mark - <UITableViewDataSource>
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 50;
}

/**
 *  什么时候调用:每当有一个cell进入视野范围内就会调用
 */
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 0.重用标识
    // 被static修饰的局部变量:只会初始化一次,在整个程序运行过程中,只有一份内存
    static NSString *ID = @"cell";

    // 1.先根据cell的标识去缓存池中查找可循环利用的cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

    // 2.如果cell为nil(缓存池找不到对应的cell)
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
    }

    // 3.覆盖数据
    cell.textLabel.text = [NSString stringWithFormat:@"testdata - %zd", indexPath.row];

    return cell;
}
@end
//
//  ViewController.m
//  06-UITableView02-单组数据
#import "ViewController.h"
#import "XMGHero.h"

@interface ViewController () <UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITableView *tableView;
/** 英雄数据 */
@property (nonatomic, strong) NSArray *heroes;
@end

@implementation ViewController

- (NSArray *)heroes
{
    if (_heroes == nil) {
        // 加载plist中的字典数组
        NSString *path = [[NSBundle mainBundle] pathForResource:@"heroes.plist" ofType:nil];
        NSArray *dictArray = [NSArray arrayWithContentsOfFile:path];

        // 字典数组 -> 模型数组
        NSMutableArray *heroArray = [NSMutableArray array];
        for (NSDictionary *dict in dictArray) {
            XMGHero *hero = [XMGHero heroWithDict:dict];
            [heroArray addObject:hero];
        }

        _heroes = heroArray;
    }
    return _heroes;
}

// 定义重用标识
NSString *ID = @"hero";

- (void)viewDidLoad {
    [super viewDidLoad];

    // 注册某个标识对应的cell类型
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:ID];
}

#pragma mark - <UITableViewDataSource>
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.heroes.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 1.去缓存池中查找cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

    // 2.覆盖数据
    XMGHero *hero = self.heroes[indexPath.row];
    cell.textLabel.text = hero.name;
    cell.imageView.image = [UIImage imageNamed:hero.icon];
    cell.detailTextLabel.text = hero.intro;

    return cell;
}
@end
//
//  XMGHero.h
//  06-UITableView02-单组数据
#import <Foundation/Foundation.h>

@interface XMGHero : NSObject
/** 姓名 */
@property (nonatomic, strong) NSString *name;
/** 图标 */
@property (nonatomic, strong) NSString *icon;
/** 简介 */
@property (nonatomic, strong) NSString *intro;

+ (instancetype)heroWithDict:(NSDictionary *)dict;
@end
//
//  XMGHero.m
//  06-UITableView02-单组数据
#import "XMGHero.h"

@implementation XMGHero
+ (instancetype)heroWithDict:(NSDictionary *)dict
{
    XMGHero *hero = [[self alloc] init];
    hero.name = dict[@"name"];
    hero.icon = dict[@"icon"];
    hero.intro = dict[@"intro"];
    return hero;
}
@end
时间: 2024-10-29 19:12:22

源码-0203-cell的循环利用01的相关文章

iOS开发UI篇—自定义瀑布流控件(cell的循环利用)

iOS开发UI篇—自定义瀑布流控件(cell的循环利用) 一.简单说明 当滚动的时候,向数据源要cell. 当UIScrollView滚动的时候会调用layoutSubviews在tableView中也是一样的,因此,可以用这个方法来监听scrollView的滚动,可以在在这个地方向数据源索要对应位置的cell(frame在屏幕上的cell). 示例: 当scrollView在屏幕上滚动的时候,离开屏幕的cell应该放到缓存池中去,询问即将(已经)进入到屏幕的cell,对于还没有进入到屏幕的ce

iOS开发:一个瀑布流的设计与实现(已实现缓存池功能,该功能使得瀑布流cell可以循环利用)

一个瀑布流的实现有三种方式: 继承自UIScrollView,仿写UITableView的dataSource和delegate,创造一个缓存池用来实现循环利用cell 写多个UITableview(UITableView的cell宽度是与UITableView宽度一样的,那么每行可以摆设多个宽度相等的UITableView,从而实现瀑布流),不过这种方法是最差的,因为不能有效的做到循环利用cell 可以自定义UICollectionViewCell的布局,从而实现瀑布流,UICollectio

Android 【山西违章查询实现1】(解析网页源码然后ListView显示出来)---利用正则表达式解析网页源码

这几天学习Android网络方面的,本来想从网上找些违章查询的接口,看了一下基本上都是付费的,索性自己写一个. 主要是 到正则表达式(我都不好意思说我用的正则表达式了)解析了一个网页,然后从ListView显示出来,还有轻量级的SQlite(储存违章查询). 想写一个详细点的所以慢慢来,以后自己回来看的时候估计也会觉得自己写的很乱吧. ---------------------------------- 1.首页查看自己要解析的网页和网址的构成 还需要验证码,最后发现验证码就是骗人的(有点坑啊)

spring源码系列——spring循环引用

众所周知spring在默认单例的情况下是支持循环引用的 Appconfig.java类的代码 @Configurable@ComponentScan("com.shadow")public class Appconfig {}1234X.java类的代码 package com.shadow.service; import org.springframework.beans.factory.annotation.Autowired;import org.springframework.

【spring】spring源码阅读之xml读取、bean注入(BeanFactory)

前言 此源码其实是在4月中旬就看了,而且当初也写了一份word文档,但不打算直接把word发上来.还是跟着以前的笔记.跟踪代码边看边写吧. 其实当初看源码的理由很简单,1.才进新公司,比较有空闲.2.面试老是问spring的问题,我理论又不好,所以想看下. 但现在,我重新看的目的其实不在于其实现原理,而是想学习和写出好的编码风格.(当初大概花了1周看,记得那时把看到的都理解深刻了,但现在基本不记得什么了.毕竟开发用不到) 一.如何开始阅读源码? 最初我也一头雾水,不知道从哪开始看.怎么看.看源码

spring源码分析

spring源码剖析(九)springMVC源码剖析 springMVC 相信大伙都用过,但是spring框架对于你请求的一个url 到你看到的返回结果,期间做了哪些出来呢,文件上传的封装?controller的寻找?过滤器的调用?AOP的调用?视图的解析?页面的跳转?  这些过程具体是怎么实现的,下面我们一一来向大家介绍springMVC的架构.... 2017-02-26 14:02 阅读(248) 评论(0) spring源码剖析(八)spring整合mybatis原理 MyBatis相信

iOS开发UI篇—无限轮播(循环利用)

一.无限轮播  1.简单说明 在开发中常需要对广告或者是一些图片进行自动的轮播,也就是所谓的无限滚动. 在开发的时候,我们通常的做法是使用一个UIScrollView,在UIScrollView上面添加多个imageView,然后设置imageView的图片,和scrollView的滚动范围. 以前的做法: 一般而言,轮播的广告或者是图片数量都不会太多(3~5张).所以,并不会太多的去考虑性能问题.但是如果图片过多(比如有16张图片,就需要创建16个imageView),那么就不得不考虑性能问题

Linux下源码安装CodeBlocks

Linux下源码安装CodeBlocks qianghaohao(CodingNutter) 一. 安装平台说明: CentOs6.4-i686  gcc-4.4.7 二. 下载最新源码: http://www.codeblocks.org/downloads 在此安装的是最新版:Code::Blocks 16.01 三. 阅读官方安装说明文档: http://wiki.codeblocks.org/index.php/Installing_Code::Blocks_from_source_on

tableView循环利用性能优化

tableView性能优化 - cell的循环利用方式1 /** * 什么时候调用:每当有一个cell进入视野范围内就会调用 */ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // 0.重用标识 // 被static修饰的局部变量:只会初始化一次,在整个程序运行过程中,只有一份内存 static NSString *ID = @"c