Skip to content

Commit 311e39c

Browse files
committed
解答循环链接问题【第七份】&&CocoaPods原理【第四份】参考答案完善 &&前七份面试题索引细节调整
1 parent 0ba33d5 commit 311e39c

8 files changed

+518
-394
lines changed

README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,7 @@
6868
## 赞赏一下旺仔(收集整理不易,且赞且珍惜)
6969

7070
</p>
71-
<img src="https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/18ff90e4c8344f86aa69c34065bb379a~tplv-k3u1fbpfcp-zoom-1.image" width="300" height="300">
72-
<img src="./images/wechat.JPG" width="300" height="300">
71+
<img src="https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/18ff90e4c8344f86aa69c34065bb379a~tplv-k3u1fbpfcp-zoom-1.image" width="300" height="300"><img src="./images/wechat.JPG" width="300" height="300">
7372
</p>
7473

7574
## 欢迎提交 PR / issue

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

Lines changed: 51 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,21 @@
55
66
> 题目出处: zhuanlan.zhihu.com/p/22834934
77
8-
- [谈下iOS开发中知道的哪些锁?](#谈下ios开发中知道的哪些锁)
9-
- [iOS下如何实现指定线程数目的线程池?](#ios下如何实现指定线程数目的线程池)
10-
- [如何用HTTP实现长连接?](#如何用http实现长连接)
11-
- [HTTP的post和get啥区别](#http的post和get啥区别)
12-
- [使用atomic一定是线程安全的吗?](#使用atomic一定是线程安全的吗)
13-
- [数据库建表的时候索引有什么用?](#数据库建表的时候索引有什么用)
14-
- [介绍下iOS设备获取唯一设备号的历史变迁](#介绍下ios设备获取唯一设备号的历史变迁)
15-
- [如何使用runtime
8+
- [谈下iOS开发中知道的哪些锁?](#谈下ios开发中知道的哪些锁)
9+
- [iOS下如何实现指定线程数目的线程池?](#ios下如何实现指定线程数目的线程池)
10+
- [如何用HTTP实现长连接?](#如何用http实现长连接)
11+
- [HTTP的post和get啥区别](#http的post和get啥区别)
12+
- [使用atomic一定是线程安全的吗?](#使用atomic一定是线程安全的吗)
13+
- [数据库建表的时候索引有什么用?](#数据库建表的时候索引有什么用)
14+
- [介绍下iOS设备获取唯一设备号的历史变迁](#介绍下ios设备获取唯一设备号的历史变迁)
15+
- [如何使用runtime
1616
hook一个class的某个方法,又如何hook某个instance的方法?](#如何使用runtime-hook一个class的某个方法又如何hook某个instance的方法)
17-
- [聊下HTTP的POST的body体使用form-urlencoded和multipart/form-data的区别。](#聊下http的post的body体使用form-urlencoded和multipartform-data的区别)
18-
- [通过\[UIImage
17+
- [聊下HTTP的POST的body体使用form-urlencoded和multipart/form-data的区别。](#聊下http的post的body体使用form-urlencoded和multipartform-data的区别)
18+
- [通过\[UIImage
1919
imageNamed:\]生成的对象什么时候被释放?](#通过uiimage-imagenamed生成的对象什么时候被释放)
20-
- [applicationWillEnterForeground和applicationDidBecomeActive都会在哪些场景下被调用?举例越多越好。](#applicationwillenterforeground和applicationdidbecomeactive都会在哪些场景下被调用举例越多越好)
21-
- [如何终止正在运行的工作线程?](#如何终止正在运行的工作线程)
22-
- [iOS下所有的本地持久化方案?](#ios下所有的本地持久化方案)
20+
- [applicationWillEnterForeground和applicationDidBecomeActive都会在哪些场景下被调用?举例越多越好。](#applicationwillenterforeground和applicationdidbecomeactive都会在哪些场景下被调用举例越多越好)
21+
- [如何终止正在运行的工作线程?](#如何终止正在运行的工作线程)
22+
- [iOS下所有的本地持久化方案?](#ios下所有的本地持久化方案)
2323

2424

2525
## 谈下iOS开发中知道的哪些锁?
@@ -31,13 +31,13 @@
3131
<details>
3232
<summary> 参考内容 </summary>
3333

34-
- 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等问题,这时候就需要我们保证每次只有一个线程访问这一块资源,锁 应运而生
34+
> 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等问题,这时候就需要我们保证每次只有一个线程访问这一块资源,锁 应运而生
3535
3636
- `@synchronized` 性能最差,SD和AFN等框架内部有使用这个.
3737

3838
- NSRecursiveLock 和 NSLock :建议使用前者,避免循环调用出现**死锁**
3939

40-
- OSSpinLock 自旋锁 ,存在的问题是, 优先级反转问题,破坏了spinlock
40+
- OSSpinLock 自旋锁,存在的问题是:优先级反转问题,破坏了spinlock
4141

4242
- dispatch_semaphore 信号量 : 保持线程同步为线程加锁
4343

@@ -78,6 +78,8 @@ dispatch_semaphore_signal(signal):可以理解为 unlock,会使得 signal 值
7878
<details>
7979
<summary> 参考内容 </summary>
8080
81+
### 回答思路
82+
8183
- 循环通过pthread_create创建线程,创建s_tf thread对象做为线程句,加入线程数组,s_tftask_content->methord初始化为空函数
8284
8385
- 创建任务执行函数,执行完通过task初始化函数后,在执行函数中通过pthread_cond_wait信号将当前创建的线程挂起
@@ -86,6 +88,33 @@ dispatch_semaphore_signal(signal):可以理解为 unlock,会使得 signal 值
8688
8789
</details>
8890
91+
92+
### 参考样例实现代码(基于dispatch_semaphore)
93+
94+
<details>
95+
<summary> 参考内容 </summary>
96+
97+
```
98+
dispatch_queue_t workConcurrentQueue = dispatch_queue_create("example.code", DISPATCH_QUEUE_CONCURRENT);
99+
dispatch_queue_t serialQueue = dispatch_queue_create("example.code.task",DISPATCH_QUEUE_SERIAL);
100+
dispatch_semaphore_t semaphore = dispatch_semaphore_create(3);
101+
for (NSInteger i = 0; i < 10; i++) {
102+
dispatch_async(serialQueue, ^{
103+
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
104+
dispatch_async(workConcurrentQueue, ^{
105+
NSLog(@"thread-info:%@开始执行任务%d",[NSThread currentThread],(int)i);
106+
sleep(1);
107+
NSLog(@"thread-info:%@结束执行任务%d",[NSThread currentThread],(int)i);
108+
dispatch_semaphore_signal(semaphore);});
109+
});
110+
}
111+
NSLog(@"主线程...!");
112+
113+
```
114+
115+
</details>
116+
117+
89118
## 如何用HTTP实现长连接?
90119
<details>
91120
<summary> 参考内容 </summary>
@@ -117,6 +146,7 @@ dispatch_semaphore_signal(signal):可以理解为 unlock,会使得 signal 值
117146
- 数组的初始化,赋值,取值安全
118147
- 数组的添加数据元素并非线程安全
119148
- BOOL 类型 修饰符不受到atomic或者noatomic影响
149+
120150
</details>
121151
122152
@@ -235,16 +265,15 @@ dispatch_semaphore_signal(signal):可以理解为 unlock,会使得 signal 值
235265
</details>
236266

237267

268+
### 觉得整理的蛮不错,可以赞赏一下旺仔(收集整理不易,且赞且珍惜)
269+
270+
</p>
271+
<img src="../images/wechat.JPG" width="300" height="300"><img src="https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/18ff90e4c8344f86aa69c34065bb379a~tplv-k3u1fbpfcp-zoom-1.image" width="300" height="300">
272+
</p>
273+
238274
## 链接
239275

240276
- [面试题系列目录](../README.md)
241277
- **下一份**: [interview-iOS-2](02interview-iOS-2.md)
242278

243-
## 赞赏一下旺仔(收集整理不易,且赞且珍惜)
244-
245-
</p>
246-
<img src="../images/wechat.JPG" width="300" height="300">
247-
<img src="https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/18ff90e4c8344f86aa69c34065bb379a~tplv-k3u1fbpfcp-zoom-1.image" width="300" height="300">
248-
</p>
249-
250279

interview-iOS/02interview-iOS-2.md

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
## interview-iOS -2
22

3-
- [weak修饰的释放则自动被置为nil的实现原理](#weak修饰的释放则自动被置为nil的实现原理)
4-
- [HTTPS的加密原理](#https的加密原理)
5-
- [网络通讯中加密方式有哪些,各自的原理?](#网络通讯中加密方式有哪些各自的原理)
6-
- [开发中iOS缓存的理解](#开发中ios缓存的理解)
7-
- [你认为开发中那些导致crash?](#你认为开发中那些导致crash)
8-
- [应用逻辑的Bug](#应用逻辑的bug)
9-
- [违反iOS系统规则产生crash的三种类型](#违反ios系统规则产生crash的三种类型)
10-
- [SDWebImage](#sdwebimage)
11-
- [加载图片的流程](#加载图片的流程)
12-
- [SDImageCache是怎么做数据管理的?](#sdimagecache是怎么做数据管理的)
13-
- [内部做Decoder的原因
3+
- [weak修饰的释放则自动被置为nil的实现原理](#weak修饰的释放则自动被置为nil的实现原理)
4+
- [HTTPS的加密原理](#https的加密原理)
5+
- [网络通讯中加密方式有哪些,各自的原理?](#网络通讯中加密方式有哪些各自的原理)
6+
- [开发中iOS缓存的理解](#开发中ios缓存的理解)
7+
- [你认为开发中那些导致crash?](#你认为开发中那些导致crash)
8+
- [应用逻辑的Bug](#应用逻辑的bug)
9+
- [违反iOS系统规则产生crash的三种类型](#违反ios系统规则产生crash的三种类型)
10+
- [SDWebImage](#sdwebimage)
11+
- [加载图片的流程](#加载图片的流程)
12+
- [SDImageCache是怎么做数据管理的?](#sdimagecache是怎么做数据管理的)
13+
- [内部做Decoder的原因
1414
(典型的空间换时间)](#内部做decoder的原因-典型的空间换时间)
15-
- [crash的收集和定位bug的方式](#crash的收集和定位bug的方式)
15+
- [Crash的收集和定位bug的方式](#crash的收集和定位bug的方式)
1616

1717
## weak修饰的释放则自动被置为nil的实现原理
1818

@@ -23,7 +23,7 @@
2323
- Weak表是Hash表,Key是所指对象的地址,Value是Weak指针地址的数组
2424
- 在对象被回收的时候,经过层层调用,会最终触发下面的方法将所有Weak指针的值设为nil。
2525
- runtime源码,objc-weak.m 的 arr_clear_deallocating 函数
26-
- weak指针的使用涉及到Hash表的增删改查,有一定的性能开销.
26+
- weak指针的使用涉及到Hash表的增删改查,**有一定的性能开销**.
2727

2828
</details>
2929

@@ -201,15 +201,15 @@
201201
</details>
202202

203203

204-
## 链接
205-
206-
- [面试题系列目录](../README.md)
207-
- **上一份**: [01一份"有点难"的iOS面试题MrPeak2016年](01一份"有点难"的iOS面试题MrPeak2016年.md)
208-
- **下一份**: [interview-iOS-3](03interview-iOS-3.md)
209-
210-
## 赞赏一下旺仔(收集整理不易,且赞且珍惜)
204+
### 觉得整理的蛮不错,可以赞赏一下旺仔(收集整理不易,且赞且珍惜)
211205

212206
</p>
213-
<img src="https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/18ff90e4c8344f86aa69c34065bb379a~tplv-k3u1fbpfcp-zoom-1.image" width="300" height="300">
214-
<img src="../images/wechat.JPG" width="300" height="300">
207+
<img src="../images/wechat.JPG" width="300" height="300"><img src="https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/18ff90e4c8344f86aa69c34065bb379a~tplv-k3u1fbpfcp-zoom-1.image" width="300" height="300">
215208
</p>
209+
210+
211+
## 链接
212+
213+
- [面试题系列目录](../README.md)
214+
- **上一份**: [第一份:一份"有点难"的iOS面试题MrPeak2016年](01一份"有点难"的iOS面试题MrPeak2016年.md)
215+
- **下一份**: [第三份:interview-iOS-3](03interview-iOS-3.md)

0 commit comments

Comments
 (0)