天眼查

天眼查

1.通用化技术提升迭代效率

2.降低三方 App 接入成本

3.SDK 体积优化,为什么用 Masonry 会增加体积

4.加载速度优化,怎么统计的?多个请求并发怎么处理的?

5.引用计数,isa 里都有什么?weak 的实现?对象的释放流程

6.方法交换交换的是什么?

7.SDWebImage加载url的流程,三级缓存,清除缓存

7.block 的变量捕获,为什么用__block可以修改局部变量的值

8.找出代码里有问题的地方,可变数组用 copy 修饰,调用添加元素方法会发生什么?能不能上报、拦截闪退?线程不安全怎么处理?常用的加锁方式,区别?

9.删除链表的倒数第 N 个结点

参考答案

1.通用化技术提升迭代效率

2.降低三方 App 接入成本

3.SDK 体积优化,为什么用 Masonry 会增加体积

4.加载速度优化,怎么统计的?多个请求并发怎么处理的?

5.引用计数,isa 里都有什么?weak 的实现?对象的释放流程,怎么判断是否有弱引用

isa

  • nonpointer 0,代表普通的指针,存储着Class、Meta-Class对象的内存地址1,代表优化过,使用位域存储更多的信息

  • has_assoc 是否有设置过关联对象,如果没有,释放时会更快

  • has_cxx_dtor 是否有C++的析构函数(.cxx_destruct),如果没有,释放时会更快

  • shiftcls 存储着Class、Meta-Class对象的内存地址信息

  • magic 用于在调试时分辨对象是否未完成初始化

  • weakly_referenced 是否有被弱引用指向过,如果没有,释放时会更快

  • deallocating 对象是否正在释放

  • extra_rc 里面存储的值是引用计数器减1

  • has_sidetable_rc 引用计数器是否过大无法存储在isa中如果为1,那么引用计数会存储在一个叫SideTable的类的属性中

6.方法交换交换的是什么?

7.block 的变量捕获,为什么用__block可以修改局部变量的值

8.找出代码里有问题的地方,可变数组用 copy 修饰,调用添加元素方法会发生什么?能不能上报、拦截闪退?线程不安全怎么处理?常用的加锁方式,区别?

9.删除链表的倒数第 N 个结点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
var removeNthFromEnd = function(head, n) {
let length = getLength(head);
let i = length - n;
let dummyNode = new ListNode();
dummyNode.next = head;
let p = dummyNode;
while (i > 0) {
p = p.next;
i--;
}
p.next = p.next.next;
return dummyNode.next;
};

var getLength = function(head) {
let length = 0;
let p = head;
while (p) {
length++;
p = p.next;
}
return length;
}
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×