1.UITableView的重用机制
UITableView的重用机制是为了避免大数据量时,会浪费大量内存,设备产生内存负担。
实际上,不论数据量多大,我们每次最多只能显示一个屏的数据量,多余的数据量不会显示。此时就没有必要加载全部数据。所以有了重用机制
重用机制的原理:
1.首先查看UITableView头文件会发现两个可变数组visiableCells 和 reusableTableCells。前者保存当前显示的cell,后者保存可重用的cell。
2.tableView刚创建显示时,reusableTableCells数组为空,通过重用标识来创建cell时,都返回nil。然后走if方法进行初始化cell操作。将初始化的cell放入到visiableCells数组中。(visiableCells中存储屏幕显示最大数量的cell+1个cell)
3.拖动tableView时,消失的cell0会从visiableCells数组中移除,保存到reusableTableCells数组中。刚显示的cell1会保存到visiableCells中。
4.再次拖动tableView时,由于reusableTableCells不为空,初始化cell就会调用dequeueReusableCellWithIdentifier:方法从reusableTableCells中根据ID拿取对应ID的cell进行复用。
2.内存管理机制
iOS开发中,内存中的对象主要有两类,一类是值类型,如int,float,double等基本数据类型;另一类是引用类型,就是继承自NSObject对象的类。前者不需要我们管理,后者引用类型需要我们管理(MRC时代,全部由程序员手动释放;ARC时代自动释放。)
内存管理是通过引用计数的方式对引用类型进行管理,当引用对象的引用计数为0时,就会被回收释放;否则,会出现内存泄露。
引用对象每retain一次引用计数就会 +1,release一次就会 -1;
3.进程与线程的区别
概念:进程是CPU分配资源的最小单位;线程是CPU调度的最小单位。
理解:进程和线程是CPU工作处于不同时间的划分。举个例子...
在设备上运行一个软件时,软件的执行需要使用到设备上的其他资源(如显卡、GPU、GPS、外设等),这时除了CPU以外的所有就构成了程序的执行环境,这时可以理解为是一个进程;
在已存在的执行环境中(共享程序上下文),CPU调用程序其他代码段实现相应功能的过程(此时CPU的时间段更小)就可以理解为线程。
4.谈谈你对Block和delegate的理解
block优点:
1.轻量级回调,可以直接访问上下文,使用块的地方和实现的地方在同一位置,使代码组织更连贯。
2.block是一个匿名函数,使用起来对数据的保护更安全(逆向一般只能拿到.h文件的方法声明)。
缺点:
1.运行成本较高(block需要将数据从栈区cp到堆区)。
2.可能发生循环引用(cycle retain),造成内存泄露。
3.有多个相关方法时,需要多次设置。
delegate优点:
1.运行成本低(只是保存了一个对象指针,直接回调,没有额外消耗)。
2.不会造成循环引用,使用时更轻松。
3.有多个相关方法时,只需要设置一次,就可以实现多次回调。
缺点:
1.相对较重量级的回调,方法的声明和实现分离,代码连贯性差。
2.暴露在.h文件中,容易被逆向,相对不够安全。
5.了解多线程吗?(未完待续...)