5
5
6
6
> 题目出处: zhuanlan.zhihu.com/p/22834934
7
7
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
16
16
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
19
19
imageNamed:\] 生成的对象什么时候被释放?] ( #通过uiimage-imagenamed生成的对象什么时候被释放 )
20
- - [ applicationWillEnterForeground和applicationDidBecomeActive都会在哪些场景下被调用?举例越多越好。] ( #applicationwillenterforeground和applicationdidbecomeactive都会在哪些场景下被调用举例越多越好 )
21
- - [ 如何终止正在运行的工作线程?] ( #如何终止正在运行的工作线程 )
22
- - [ iOS下所有的本地持久化方案?] ( #ios下所有的本地持久化方案 )
20
+ - [ applicationWillEnterForeground和applicationDidBecomeActive都会在哪些场景下被调用?举例越多越好。] ( #applicationwillenterforeground和applicationdidbecomeactive都会在哪些场景下被调用举例越多越好 )
21
+ - [ 如何终止正在运行的工作线程?] ( #如何终止正在运行的工作线程 )
22
+ - [ iOS下所有的本地持久化方案?] ( #ios下所有的本地持久化方案 )
23
23
24
24
25
25
## 谈下iOS开发中知道的哪些锁?
31
31
<details >
32
32
<summary > 参考内容 </summary >
33
33
34
- - 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等问题,这时候就需要我们保证每次只有一个线程访问这一块资源,锁 应运而生
34
+ > 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等问题,这时候就需要我们保证每次只有一个线程访问这一块资源,锁 应运而生
35
35
36
36
- ` @synchronized ` 性能最差,SD和AFN等框架内部有使用这个.
37
37
38
38
- NSRecursiveLock 和 NSLock :建议使用前者,避免循环调用出现** 死锁**
39
39
40
- - OSSpinLock 自旋锁,存在的问题是, 优先级反转问题,破坏了spinlock
40
+ - OSSpinLock 自旋锁,存在的问题是: 优先级反转问题,破坏了spinlock
41
41
42
42
- dispatch_semaphore 信号量 : 保持线程同步为线程加锁
43
43
@@ -78,6 +78,8 @@ dispatch_semaphore_signal(signal):可以理解为 unlock,会使得 signal 值
78
78
<details>
79
79
<summary> 参考内容 </summary>
80
80
81
+ ### 回答思路
82
+
81
83
- 循环通过pthread_create创建线程,创建s_tf thread对象做为线程句,加入线程数组,s_tftask_content->methord初始化为空函数
82
84
83
85
- 创建任务执行函数,执行完通过task初始化函数后,在执行函数中通过pthread_cond_wait信号将当前创建的线程挂起
@@ -86,6 +88,33 @@ dispatch_semaphore_signal(signal):可以理解为 unlock,会使得 signal 值
86
88
87
89
</details>
88
90
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
+
89
118
## 如何用HTTP实现长连接?
90
119
<details>
91
120
<summary> 参考内容 </summary>
@@ -117,6 +146,7 @@ dispatch_semaphore_signal(signal):可以理解为 unlock,会使得 signal 值
117
146
- 数组的初始化,赋值,取值安全
118
147
- 数组的添加数据元素并非线程安全
119
148
- BOOL 类型 修饰符不受到atomic或者noatomic影响
149
+
120
150
</details>
121
151
122
152
@@ -235,16 +265,15 @@ dispatch_semaphore_signal(signal):可以理解为 unlock,会使得 signal 值
235
265
</details >
236
266
237
267
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
+
238
274
## 链接
239
275
240
276
- [ 面试题系列目录] ( ../README.md )
241
277
- ** 下一份** : [ interview-iOS-2] ( 02interview-iOS-2.md )
242
278
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
-
250
279
0 commit comments