File tree Expand file tree Collapse file tree 2 files changed +24
-4
lines changed
Expand file tree Collapse file tree 2 files changed +24
-4
lines changed Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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
You can’t perform that action at this time.
0 commit comments