Skip to content

Commit 6ef270f

Browse files
committed
Fix conflicts
2 parents 330a1dc + 31f5e75 commit 6ef270f

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

source/iOS/Cocoa-Touch/Multithreading.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -557,11 +557,10 @@ typedef enum : NSInteger {
557557

558558
* 首先要明确一点,NSOperationQueue 是基于 GCD 的更高层的封装,从 OS X 10.10 开始可以通过设置 `underlyingQueue` 来把 operation 放到已有的 dispatch queue 中。
559559
* 从易用性角度,GCD 由于采用 C 风格的 API,在调用上比使用面向对象风格的 NSOperation 要简单一些。
560-
* 从对任务的控制性来说,NSOperation 显著得好于 GCD,和 GCD 相比可以很方便实现 Cancel 操作,也可以很方便的设置任务之间的依赖关系,以及在同一个队列中任务的优先级设置,同时还可以通过 KVO 来监控任务的执行情况。这些通过 GCD 也可以实现,不过需要很多代码,使用 NSOperation 显得方便了很多。
561-
* 从第三方库的角度,知名的第三方库如 AFNetworking 和 SDWebImage 背后都是使用 NSOperation,也从另一方面说明对于需要复杂并发控制的需求,NSOperation 是更好的选择。
560+
* 从对任务的控制性来说,NSOperation 显著得好于 GCD,和 GCD 相比支持了 Cancel 操作,支持任务之间的依赖关系,支持同一个队列中任务的优先级设置,同时还可以通过 KVO 来监控任务的执行情况。这些通过 GCD 也可以实现,不过需要很多代码,使用 NSOperation 显得方便了很多。
561+
* 从第三方库的角度,知名的第三方库如 AFNetworking 和 SDWebImage 背后都是使用 NSOperation,也从另一方面说明对于需要复杂并发控制的需求,NSOperation 是更好的选择(当然也不是绝对的,例如知名的 [Parse SDK](https://github.com/ParsePlatform/Parse-SDK-iOS-OSX) 就完全没有使用 NSOperation,全部使用 GCD,其中涉及到大量的 GCD 高级用法,[这里](https://github.com/ChenYilong/ParseSourceCodeStudy)有相关解析)
562562

563-
564-
#### 参考资料
563+
#### 参考资料
565564

566565
* http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues
567566
* http://www.humancode.us/2014/08/14/target-queues.html

source/iOS/ObjC-Basic/MM.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,26 @@ __strong Number* num = [[Number alloc] init];
129129

130130
`copy` 类似于 `strong`,不过在赋值时进行 `copy` 操作而不是 `retain` 操作。通常在需要保留某个不可变对象(NSString最常见),并且防止它被意外改变时使用。
131131

132+
##### 错误使用属性标识符的后果
133+
134+
如果我们给一个原始类型设置 `strong\weak\copy` ,编译器会直接报错:
135+
136+
> Property with 'retain (or strong)' attribute must be of object type
137+
138+
设置为 `unsafe_unretained` 倒是可以通过编译,只是用起来跟 `assign` 也没有什么区别。
139+
140+
反过来,我们给一个 NSObject 属性设置为 assign,编译器会报警:
141+
142+
> Assigning retained object to unsafe property; object will be released after assignment
143+
144+
正如警告所说的,对象在赋值之后被立即释放,对应的属性也就成了野指针,运行时跑到属性有关操作会直接崩溃掉。和设置成 `unsafe_unretained` 是一样的效果(设置成 `weak` 不会崩溃)。
145+
146+
##### `unsafe_unretained` 的用处
147+
148+
`unsafe_unretained` 差不多是实际使用最少的一个标识符了,在使用中它的用处主要有下面几点:
149+
150+
1. 兼容性考虑。iOS4 以及之前还没有引入 `weak`,这种情况想表达弱引用的语义只能使用 `unsafe_unretained`。这种情况现在已经很少见了。
151+
2. 性能考虑。使用 `weak` 对性能有一些影响,因此对性能要求高的地方可以考虑使用 `unsafe_unretained` 替换 `weak`。一个例子是 [YYModel 的实现](https://github.com/ibireme/YYModel/blob/master/YYModel/NSObject%2BYYModel.m),为了追求更高的性能,其中大量使用 `unsafe_unretained` 作为变量标识符。
132152

133153
### 引用循环
134154

@@ -445,6 +465,7 @@ Allocations 工具主要用来检测 Abandoned memory. 主要思路是在一个
445465
* [10个Objective-C基础面试题,iOS面试必备](http://www.oschina.net/news/42288/10-objective-c-interview)
446466
* [黑幕背后的 Autorelease](http://blog.sunnyxx.com/2014/10/15/behind-autorelease/)
447467
* [Objective-C Autorelease Pool 的实现原理](http://blog.leichunfeng.com/blog/2015/05/31/objective-c-autorelease-pool-implementation-principle/)
468+
* https://stackoverflow.com/questions/9784762/strong-weak-retain-unsafe-unretained-assign
448469
* https://stackoverflow.com/questions/29350634/ios-autoreleasepool-in-main-and-arc-alloc-release
449470
* https://stackoverflow.com/questions/6588211/why-do-the-ios-main-m-templates-include-a-return-statement-and-an-autorelease-po
450471
* https://stackoverflow.com/questions/2702548/if-the-uiapplicationmain-never-returns-then-when-does-the-autorelease-pool-get

0 commit comments

Comments
 (0)