Skip to content

Commit 45b4e45

Browse files
committed
【update】完整解答字节跳动面试题(08)&&解答弱网相关问题
1 parent c3651dc commit 45b4e45

8 files changed

+283
-110
lines changed

README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@
2222
2323
> ② 大部分文档面试题答案采取`折叠`方式展示。
2424
25-
1. [一份"有点难"的iOS面试题MrPeak2016年:参考答案已更新完毕](./interview-iOS/01一份"有点难"的iOS面试题MrPeak2016年.md)
26-
2. [interview-iOS-2:参考答案已更新完毕](./interview-iOS/02interview-iOS-2.md)
27-
3. [interview-iOS-3:参考答案已更新完毕](./interview-iOS/03interview-iOS-3.md)
28-
4. [interview-iOS-4:参考答案已更新完毕](./interview-iOS/04interview-iOS-4.md)
29-
5. [宝库iOS研发岗面试2017年:参考答案已更新完毕](./interview-iOS/05iOS宝库iOS开发笔试题2017年.md)
30-
6. [iOS基础问题系列2017年:参考答案已更新完毕](./interview-iOS/06iOS基础问题系列2017年.md)
31-
7. [深圳iOS面试分享2018年4月:参考答案已更新完毕](./interview-iOS/07深圳iOS面试分享2018年4月.md)
32-
8. [字节跳动面试题2018年4月:可参考答案已更新完毕](./interview-iOS/08字节跳动面试题:2018年4月.md)
25+
1. [一份"有点难"的iOS面试题MrPeak2016年:参考答案完整✅](./interview-iOS/01一份"有点难"的iOS面试题MrPeak2016年.md)
26+
2. [interview-iOS-2:参考答案完整✅](./interview-iOS/02interview-iOS-2.md)
27+
3. [interview-iOS-3:参考答案完整✅](./interview-iOS/03interview-iOS-3.md)
28+
4. [interview-iOS-4:参考答案完整✅](./interview-iOS/04interview-iOS-4.md)
29+
5. [宝库iOS研发岗面试2017年:参考答案完整✅](./interview-iOS/05iOS宝库iOS开发笔试题2017年.md)
30+
6. [iOS基础问题系列2017年:参考答案完整✅](./interview-iOS/06iOS基础问题系列2017年.md)
31+
7. [深圳iOS面试分享2018年4月:参考答案完整✅](./interview-iOS/07深圳iOS面试分享2018年4月.md)
32+
8. [字节跳动面试题2018年4月:参考答案完整✅](./interview-iOS/08字节跳动面试题:2018年4月.md)
3333
9. [头条网易微信阿里美团硕士春招面试题2018年3月](./interview-iOS/09头条网易微信阿里美团硕士春招面试题2018年3月.md)
3434
10. [美团饿了么面试题2018年4月](./interview-iOS/10美团饿了么面试题2018年4月.md)
3535
11. [天猫蚂蚁金服百度面试题2018年4月](./interview-iOS/11天猫蚂蚁金服百度面试题2018年4月.md)

interview-iOS/01一份"有点难"的iOS面试题MrPeak2016年.md

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
11

22
# 一份"有点难"的iOS面试题:MrPeak
33

4-
> MrPeak : Facebook Software engineer
4+
> MrPeak Facebook Software engineer
55
6-
>[题目出处](https://zhuanlan.zhihu.com/p/22834934)
6+
> 题目出处zhuanlan.zhihu.com/p/22834934
77
88

99
## 谈下iOS开发中知道的哪些锁?
1010

11-
> 哪个性能最差?SD和AFN使用的哪个?
12-
13-
> 一般开发中你最常用哪个?
11+
> 一般开发中你最常用哪个?
1412
15-
> 哪个锁apple存在问题又是什么问题?
13+
> 哪个性能最差?SD和AFN使用的哪个?
1614
1715
<details>
1816
<summary> 参考内容 </summary>
1917

2018
- 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等问题,这时候就需要我们保证每次只有一个线程访问这一块资源,锁 应运而生
2119

22-
- `@synchronized` 性能最差,SD和AFN等框架使用这个.
20+
- `@synchronized` 性能最差,SD和AFN等框架内部有使用这个.
2321

24-
- NSRecursiveLock 和NSLock :建议使用前者,避免循环调用出现**死锁**
22+
- NSRecursiveLock 和 NSLock :建议使用前者,避免循环调用出现**死锁**
2523

2624
- OSSpinLock 自旋锁 ,存在的问题是, 优先级反转问题,破坏了spinlock
2725

@@ -82,7 +80,7 @@ dispatch_semaphore_signal(signal):可以理解为 unlock,会使得 signal 值
8280
8381
</details>
8482
85-
## http的post和get啥区别
83+
## HTTP的post和get啥区别
8684
<details>
8785
<summary> 参考内容 </summary>
8886
@@ -202,7 +200,7 @@ dispatch_semaphore_signal(signal):可以理解为 unlock,会使得 signal 值
202200
</details>
203201

204202
## iOS下所有的本地持久化方案?
205-
> [相似问题:iOS中常用的数据存储方式有哪些](./06iOS基础问题系列2017年.md)
203+
> [本系列面试题相似问题:iOS中常用的数据存储方式有哪些](./06iOS基础问题系列2017年.md)
206204
207205
<details>
208206
<summary> 参考内容 </summary>

interview-iOS/05iOS宝库iOS开发笔试题2017年.md

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# 宝库iOS开发笔试题
2+
23
> 较为简单,可快速略过
34
45
## 对数组中的元素去重复
@@ -189,7 +190,7 @@ dispatch_group_t group = dispatch_group_create();
189190
<summary> 参考内容 </summary>
190191
191192
```objc
192-
1 .h
193+
193194
- (instancetype)init __attribute__((unavailable("Disabled. Use +sharedInstance instead")));
194195
- (instancetype)init NS_UNAVAILABLE;
195196
@@ -202,17 +203,16 @@ dispatch_group_t group = dispatch_group_create();
202203
}
203204
204205
// 通过断言
205-
- (instancetype)init1{
206+
- (instancetype)init{
206207
NSAssert(false,@"unavailable, use sharedInstance instead");
207208
return nil;
208209
}
209210
210211
// 通过异常
211-
- (instancetype)init2{
212+
- (instancetype)init{
212213
[NSException raise:NSGenericException format:@"Disabled. Use +[%@ %@] instead",
213214
NSStringFromClass([self class]),
214215
NSStringFromSelector(@selector(sharedInstance))];
215-
216216
return nil;
217217
}
218218
@@ -223,7 +223,6 @@ dispatch_group_t group = dispatch_group_create();
223223
224224
- 栈私有, 堆公有
225225
226-
227226
## 链接
228227
229228
- [面试题系列目录](../README.md)

interview-iOS/06iOS基础问题系列2017年.md

Lines changed: 66 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -8,66 +8,87 @@
88

99
- KVC : 键值编码,是Key Value Coding 的简称,cocoa的标准组成部分,是一种可以直接通过字符串的名字(Key)来访问类属性的机制,而不是通过调用Setter方法、Getter方法进行访问
1010
- KVO:(Key Value Observer)键值观察者,是观察者设计模式的一种具体实现
11-
- [detail-link](https://www.jianshu.com/p/10408579fae0)
11+
1212
</details>
1313

14-
### KVO的缺陷
14+
### KVO/KVC的优缺点
1515

1616
<details>
1717
<summary> 参考内容 </summary>
1818

19-
- 我们观察的属性必须使用strings定义,编译时不会出现警告
20-
- 对属性重构,将导致观察代码不可用
21-
- 复杂的 “if” 语句要求对象正在观察多个值,是因为所有的观察代码通过一个方法来指向
22-
- 当释放观察者的时候不需要移除观察者。
23-
- 继承类多层级容易出问题
19+
#### KVC:
20+
21+
- 优点:没有property的变量(私有)也能通过KVC进行设置,或者简化代码(多级属性)
22+
- 缺点:如果key只写错,编写的时候不会报错,但是运行的时候会报错
23+
24+
#### KVO优点:
25+
26+
* 能够提供一种简单的方法实现两个对象的同步;
27+
* 能够对内部对象的状态改变作出响应,而且不需要改变内部对象的实现;
28+
* 能够提供被观察者属性的最新值和之前的值;
29+
* 使用key Path来观察属性,因此可以观察嵌套对象;
30+
* 完成了对观察对象的抽象,因为不需要额外的代码来允许观察者被观察。
31+
32+
#### KVO缺点:
33+
34+
* KVO只能检测类中的属性,并且属性名都是通过NSString来查找,编译器不会补全(编译时不会出现警告),容易写错;
35+
* 对属性重构,将导致观察代码不可用;
36+
* 复杂的 “if” 语句要求对象正在观察多个值,是因为所有的观察代码通过一个方法来指向;
37+
2438
</details>
2539

26-
### Swfit和Objective-C的联系,Swift比Objective-C有什么优势?
40+
### Swfit和Objective-C的联系及Swift对比Objective-C有什么优势?
2741
<details>
2842
<summary> 参考内容 </summary>
2943

3044
- 联系:
3145
- Swift与Objective-C共用同一套运行时环境
3246
- 同一个工程,可以同时使用Swift和Objective-C
3347
- Objective-C出现过的绝大多数概念,比如引用记数、ARC、属性、协议、接口、初始化、扩展类、命名参数、匿名函数等,在Swift中继续有效(可能只是换了个术语)
48+
3449
- 优势
3550
- Swift容易阅读,语法和文件结构简易化。
3651
- Swift更易于维护,文件分离后结构更清晰。
3752
- Swift更加安全,它是类型安全的语言。
3853
- Swift代码更少,简洁的语法,可以省去大量冗余代码
3954
- Swift速度更快,运算性能更高。
55+
4056
</details>
4157

4258
### 举例说明Swfit里面有哪些是Objective-C中没有的?
4359

4460
<details>
4561
<summary> 参考内容 </summary>
4662

47-
```
48-
1).swift独有的范围运算符
49-
a…b 表示 [a,b] 如3…5 就是范围取3,4,5
50-
2).swift独有的元组类型
51-
var point = (x:15,y:20.2)
52-
就是元组名是 point ,里面有两个元素x和y。 有点类似于结构体.
53-
3).函数的默认参数值
54-
func addStudent (name:string,age:Int = 20) –>string{}
55-
设置了默认的年龄为20 所以再调用时只需要写个名字
56-
addStudent("DragonLi")
57-
要注意的是,使用了默认参数值, 系统会自动生成一个外部参数名。
58-
想改名字也就要写外部参数名了 即 addStudent(“zss”,age:18)
59-
4).swift中使用let定义常量,var定义变量
60-
使用常量,更加安全,不能够被修改,在需要对对象进行修改的时候 只能用var修饰.
61-
5).if let 、 guard let 的用法
62-
缩减代码量,安全处理数据逻辑。
63-
......
64-
65-
```
63+
1).swift独有的范围运算符:a…b 表示 [a,b] 如3…5 就是范围取3,4,5
64+
65+
2).swift独有的元组类型
66+
67+
var point = (x:15,y:20.2)
68+
就是元组名是 point ,里面有两个元素x和y。 有点类似于结构体.
69+
70+
3).函数的默认参数值
71+
72+
func addStudent (name:string,age:Int = 20) –>string{}
73+
设置了默认的年龄为20 所以再调用时只需要写个名字
74+
addStudent("DragonLi")
75+
要注意的是,使用了默认参数值, 系统会自动生成一个外部参数名。
76+
想改名字也就要写外部参数名了 即 addStudent(“zss”,age:18)
77+
78+
4).swift中使用let定义常量,var定义变量
79+
80+
使用常量,更加安全,不能够被修改,在需要对对象进行修改的时候 只能用var修饰.
81+
82+
5).if let 、 guard let 的用法
83+
84+
缩减代码量,安全处理数据逻辑。
85+
6686
</details>
6787

6888
### 如何对iOS设备进行性能测试?
6989
- Instruments 是应用程序用来动态跟踪和分析 Mac OS X 和 iOS 代码的实用工具。这是一个灵活而强大的工具,它让你可以跟踪一个或多个进程,并检查收集的数据
70-
- Profile-> Instruments ->Time Profiler
90+
91+
- Profile-> Instruments ->Time Profiler
7192

7293
### 集成三方框架有哪些方法?
7394
- 手动集成
@@ -79,15 +100,21 @@
79100
<details>
80101
<summary> 参考内容 </summary>
81102

82-
* 复用`cell`单元格
83-
* 单元格中的视图尽量都使用不透明的,单元格中尽量少使用动画
84-
* 图片加载或者耗时渲染操作使用异步加载
85-
* 滑动时不加载图片,停止滑动时开始加载(需要处理快速滑动的空白)
86-
* 具体看PM是否接受
87-
* 单元格中的内容可以在自定义cell类中的drawRect方法内自己绘制
88-
* 如非必要,减少reloadData全部cell,只reloadRowsAtIndexPaths
89-
* 如果cell是动态行高,计算出高度后缓存
90-
* cell高度固定的话直接使用cell.rowHeight设置高度
103+
* 缓存行高
104+
* 尽量用轻量级的对象,比如用不到事件处理的地方,可以考虑使用 CALayer 取代 UIView
105+
* 不要频繁地调用 UIView 的相关属性,比如 frame、bounds、transform 等属性,尽量减少不必要的修改
106+
* 尽量提前计算好布局,在有需要时一次性调整对应的属性,不要多次修改属性
107+
* Autolayout 会比直接设置 frame 消耗更多的 CPU 资源
108+
* 图片的 size 最好刚好跟 UIImageView 的 size 保持一致
109+
* 控制一下线程的最大并发数量
110+
* 尽量把耗时的操作放到子线程
111+
* 文本处理(尺寸计算、绘制)
112+
* 图片处理(解码、绘制)
113+
114+
* 尽量避免短时间内大量图片的显示,尽可能将多张图片合成一张进行显示
115+
* 尽量减少视图数量和层次
116+
* 减少透明的视图(alpha<1),不透明的就设置 opaque 为 YES
117+
* 尽量避免出现离屏渲染
91118

92119
</details>
93120

@@ -96,6 +123,8 @@
96123
97124
### iOS中常用的数据存储方式有哪些?
98125

126+
- [相似问题链接](./01一份"有点难"的iOS面试题MrPeak2016年.md#链接)
127+
99128
<details>
100129
<summary> 参考内容 </summary>
101130

@@ -171,7 +200,6 @@
171200
</details>
172201

173202

174-
175203
## 链接
176204

177205
- [面试题系列目录](../README.md)

interview-iOS/07深圳iOS面试分享2018年4月.md

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@
1010
<details>
1111
<summary> 参考内容 </summary>
1212

13-
- 这是一个经常被问到的问题,百度网上解法也很多。这里仅提供基本思路,供参考:
14-
- 把1000万的整型平均分到合适n个文件中,分别对每一份文件找出前1000个最大的数,最后对每份文件前1000数据用常规算法合并即可。
15-
- 那么,如何从每一份文件中找出前1000个最大的数呢?
16-
- **先取文件中前1000个数放到数组中,并排好序(假设升序),之后从文件中读取下一个数与数组第一个数比较,如果比数组中第一个数大,则替换数组第一个数,并重新排序,之后再取下一个数进行下轮比较即可。**
13+
> 这是一个经常被问到的问题,百度网上解法也很多。这里仅提供基本思路,供参考:
14+
15+
- 把1000万的整型平均分到合适n个文件中,分别对每一份文件找出前1000个最大的数,最后对每份文件前1000数据用常规算法合并即可。
16+
- 那么,如何从每一份文件中找出前1000个最大的数呢?
17+
- **先取文件中前1000个数放到数组中,并排好序(假设升序),之后从文件中读取下一个数与数组第一个数比较,如果比数组中第一个数大,则替换数组第一个数,并重新排序,之后再取下一个数进行下轮比较即可。**
1718

1819
</details>
1920

@@ -36,23 +37,26 @@
3637

3738
</details>
3839

39-
### 代码输出 ?
40-
<details>
41-
<summary> 参考内容 </summary>
40+
### NSString代码输出考察 ?
4241

43-
```objc
44-
@property (nonatomic, strong) NSString *strongString;
45-
@property (nonatomic, weak) NSString *weakString;
42+
```objc
43+
44+
@property (nonatomic, strong) NSString *strongString;
45+
@property (nonatomic, weak) NSString *weakString;
4646

47-
strongString = [NSString stringWithFormat:@"%@",@"string1"];
48-
weakString = strongString;
49-
strongString = nil;
47+
strongString = [NSString stringWithFormat:@"%@",@"string1"];
48+
weakString = strongString;
49+
strongString = nil;
5050

51-
NSLog(@"%@", weakString);
51+
NSLog(@"%@", weakString);
5252

53-
```
53+
```
54+
55+
<details>
56+
<summary> 参考内容 </summary>
57+
5458
- NSString的问题,这个跟retainCount没什么太大的关系
55-
- 首先,stringWithFormat方法创建的字符串是autorelease的,本身就会延迟释放,直接跟log的话肯定不会输出null,如果你写个button做触发,放在方法外作log的话,才会打印出null
59+
- **首先,stringWithFormat方法创建的字符串是autorelease的,本身就会延迟释放,直接跟log的话肯定不会输出null,如果你写个button做触发,放在方法外作log的话,才会打印出null**
5660
- 在64位环境下,苹果对NSString做了优化,细节不说,具体表现是,当非字面值常量的数字,英文字母字符串的长度小于等于 9 的时候会自动成为 NSTaggedPointerString 类型,如果有中文或其他特殊符号存在的话则会直接成为__NSCFString 类型。而NSTaggedPointerString是个常量释放不掉的.
5761
- 最后,如果是使用@""或者initWithString:@""的方式创建的字符串,会被转换成__NSCFConstantString,也是个常量,释放不掉不会输出null
5862
@@ -73,9 +77,10 @@
7377
7478
</details>
7579
76-
## Swift题
80+
## Swift问题
7781
7882
### struct 和 class 的区别?
83+
7984
<details>
8085
<summary> 参考内容 </summary>
8186
- 类可以继承,结构体不可以

0 commit comments

Comments
 (0)