1.『卡顿』(特指不流畅的动画)是App开发中最为常见的性能问题表现。请结合你所熟悉的移动操作系统(Android、iOS 或 Windows Phone),解释一下App中卡顿的发生机理,并分别针对『界面切换卡顿』和『屏幕滑动卡顿』提出典型的优化思路。
1.网络请求放在主线程中,如果网速低会使系统响应延迟。处理方法:网络请求放入子线程中。UI的刷新放在主线程中。
2.UITableView表格卡顿,要使用以下做法:
- static NSString *CellIdentifier = @"Cell" ;
- UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
- if (cell == nil ) {
- cell = [[UITableViewCell alloc ] initWithStyle :UITableViewCellStyleSubtitle reuseIdentifier :CellIdentifier];
- }
创建一个cell储蓄池,把不加载的cell放入储蓄池中。当加载新的cell的适合,先从储蓄池中查找有没有可以复用的cell,如果有,拿来用即可;如果没有则创建新的。
3.动画和UI的卡顿,尽量避免一次性在内存中加载过多的子控件。
Android IOS 主线程阻塞可能导致界面卡顿; Android 有可能由于大量对象创建很快又被回收 内存抖动导致界面卡顿(GC执行时 整个线程停下来)
Android: {
界面切换卡顿:1.查看目的界面是否有可以重用的对象避免对象无谓的创建;
2.相关操作交给非UI线程来执行
3.避免不必要的文件读写
界面滑动卡顿: 同上+
1.考虑只加载当前界面显示部分的数据,显示哪里加载哪里,而不是重头加载到尾
2.使用缓存避免重复网络请求
}
2.关于浅复制和深复制的说法,下列说法正确的是
- 浅层复制:只复制指向对象的指针,而不复制引用对象本身。
- 深层复制:复制引用对象本身。
- 如果是浅复制,修改一个对象会影响另外一个对象
- 如果是深拷贝,修改一个对象不会影响到另外一个对象
深层拷贝 也叫做深拷贝,个人的理解应该是 拷贝了引用对象的内存,这样就会产出两块不同的内存区,而浅拷贝则是两条或多条指针指向了相同的同一块内存区域。
所以 A 、B、D 正确,
3.为什么说Object-C是runtime language?
- A:将数据类型的确定由编译时,推迟到了运行时
- 运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
- 驾驶A继承了B类,那么在编译时就已经生成了A的实例
- 多态是指不同对象以自己的方式响应相同的消息的能力
- A,oc中的数据类型在编译时确定,不应该是在运行时。
- B 正确。
- C 创建对象实例需要开辟内存空间,所以应该在运行时。
- D 多态是指,父类指针指向子类对象的一种表现。
- Objective-C Runtime有相当多的特性,首先数据类型是指数据而非对象的类型,数据一般是在编译时就已经确定类型。故A错,对象的类型判定是运行时决定的,运行时通过判别对象的类型,然后给对象发送消息(即调用对象的方法)。