@@ -107,7 +107,7 @@ ARC 是苹果引入的一种自动内存管理机制,会根据引用计数自
107107
108108变量标识符的用法如下:
109109
110- ``` objective-c
110+ ``` objectivec
111111__strong Number* num = [[Number alloc ] init ];
112112```
113113
@@ -201,6 +201,25 @@ for (int i = 0; i < 100000000; i++)
201201* 当 block 以异常(exception)结束时,pool 不会被 drain
202202* Pool 的 drain 操作会把所有标记为 autorelease 的对象的引用计数减一,但是并不意味着这个对象一定会被释放掉,我们可以在 autorelease pool 中手动 retain 对象,以延长它的生命周期(在 MRC 中)。
203203
204+ #### weak 与 Autorelease
205+
206+ 众所周知,weak 不会持有对象,当给一个 weak 赋以一个自己生成的对象后,对象会立马被释放。
207+
208+ 一个很常见的 warning 就是 Assigning retained object to weak variable, object will be released after assignment.
209+
210+ 但是我们前面也提到了,可以持有非自己生成的对象,这通过 autorelease 实现。
211+
212+ 那么如果一个 weak 被赋以一个非自己生成的对象呢?代码如下:
213+
214+ ``` objectivec
215+ __weak NSNumber *number = [NSNumber numberWithInt: 100] ;
216+ NSLog(@"number = %@", number);
217+ ```
218+
219+ 这种情况下是可以正确打印值的。
220+
221+ [clang的文档](http://clang.llvm.org/docs/AutomaticReferenceCounting.html#arc-runtime-objc-loadweak) 是这么说的:这种情况下,weak 并不会立即释放,而是会通过 `objc_loadWeak` 这个方法注册到 AutoreleasePool 中,以延长生命周期。
222+
204223#### main.m 中 Autorelease Pool 的解释
205224
206225大家都知道在 iOS 程序的 main.m 文件中有类似这样的语句:
@@ -459,25 +478,6 @@ Instrument 为我们提供了 Allocations/Leaks 这样好用的工具用来检
459478
460479Allocations 工具主要用来检测 Abandoned memory. 主要思路是在一个时间切片内检测对象的声明周期以观察内存是否会无限增长。通过 hook 掉 alloc,dealloc,retain,release 等方法,来记录对象的生命周期。
461480
462- ### weak 与 Autorelease
463-
464- 众所周知,weak 不会持有对象,当给一个 weak 赋以一个自己生成的对象后,对象会立马被释放。
465-
466- 一个很常见的 warning 就是 Assigning retained object to weak variable, object will be released after assignment.
467-
468- 但是我们前面也提到了,可以持有非自己生成的对象,这通过 autorelease 实现。
469-
470- 那么如果一个 weak 被赋以一个非自己生成的对象呢?代码如下:
471-
472- ```
473- __weak NSNumber *number = [NSNumber numberWithInt:100];
474- NSLog(@"number = %@", number);
475- ```
476-
477- 这种情况下是可以正确打印值的。
478-
479- [ clang的文档] ( http://clang.llvm.org/docs/AutomaticReferenceCounting.html#arc-runtime-objc-loadweak ) 是这么说的:这种情况下,weak 并不会立即释放,而是会通过 ` objc_loadWeak ` 这个方法注册到 AutoreleasePool 中,以延长生命周期。
480-
481481### 参考资料
482482
483483* [ Objective-C内存管理MRC与ARC] ( http://blog.csdn.net/fightingbull/article/details/8098133 )
0 commit comments