现在的位置: 首页 > 综合 > 正文

iOS开发 浅谈开发中的重用

2018年01月25日 ⁄ 综合 ⁄ 共 1196字 ⁄ 字号 评论关闭

对于开发者来说,创建一个对象,再释放一个对象,是很习惯的事情。但是在某些情况下,这种方式并不好,可能会造成开销过大、线程卡死等情况,那么怎么解决或者优化呢?那就推荐使用重用机制了。

说起重用,作为iOS开发者,最熟悉的应该就是原生控件UITableView了,那么这种重用的机制原理到底是怎样的呢。重用除了这种控件的,还有别的地方可以使用吗?

其实所有的重用机制,都是为了做一件事情,那就是减小系统的创建、释放对象的开销。

首先看看,不使用重用的情况下,操作系统做了些什么:释放旧的内存块(或者垃圾回收机制)—>分配一个新的内存块—>创建新的对象—>给对象赋值。

那如果我们使用重用呢?操作系统只需要做最后一步:给一个已存在的对象赋值。

这两种方式的实时开销差距是很大的。那么什么是重用呢?

其本质在于,创建一个可供重用的重用池,里面放上一些已经创建好的对象,需要的时候,从重用池中取出一个对象,进行赋值修改,使其成为我们需要的对象,然后再使用就可以了。这种方式在处理大量相似内容时,效率远高于创建释放的方式。

那么再看UITableView,我们调用的方法:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *cellid=@"cellid";
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellid];//尝试从重用池中取一个出来使用
    if (!cell) {//如果重用池中没有,就创建一个新的
         cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellid]autorelease];
    }
    return cell;
}

其实就是先尝试取重用池,重用池中没有空闲的就创建新的。

那么我们在日常的开发当中,这种重用的思想可以用到很多地方,比如一个界面有很多个UIButton,通过填充不同数据给不同情况下使用,那么我们其实就可以考虑使用重用,把这些东西都放入一个重用池(就是可变数组),然后用的时候再取出来使用,这样的开销要远远好于创建释放。当然,创建重用池的开销不能避免,但是通常情况,只需要几个可从用的对象,就可以完成若干的对象展示和使用问题。

那么什么地方可以使用这种重用机制呢?很简单,如果你有一大批相似的东西要处理(可封装为同一对象),但是每次只是处理其中的一小部分(或界面展示一小部分),那么就可以使用重用机制了。

希望大家在以后的开发中,在连续处理若干相似对象,而每次都不是全部使用(展示)时,可以优先想到这种优化机制:重用机制。

抱歉!评论已关闭.