1 //
2 // main.m
3 // autorelease.m
4 //
5 // Created by sixleaves on 15/5/9.
6 // Copyright (c) 2015年 itcast. All rights reserved.
7 //
8
9 #import <Foundation/Foundation.h>
10 #import "Person.h"
11 #import "Dog.h"
12 int main(int argc, const char * argv[]) {
13 @autoreleasepool { // pool1入栈
14
15 // p-1
16 Person *p = [[[Person alloc] init] autorelease];
17 // c-1
18 Dog *c = [[[Dog alloc] init] autorelease];
19
20 // p -1 c-2
21 p.dog = c;
22
23
24 @autoreleasepool { // pool2入栈
25
26 // p1-1
27 Person *p1 = [[[Person alloc] init] autorelease];
28 // c1-1
29 Dog *c1 = [[[Dog alloc] init] autorelease];
30
31 // p1 -1 c-2
32 p1.dog = c1;
33
34
35 } // pool2出栈销毁
36
37
38
39 } // pool1出栈销毁。
40
41 return 0;
42 }
43 /*
44 自动释放池的管理是通过栈这个数据结构进行管理。
45
46 autorelease的优点:
47 1.不要在关心对象的释放时间。
48 2.不用再关心什么时候用release。
49
50 autorelease的使用场合(注意点):
51 1.对于占用内存交大的对象,不要使用autorelease,因为不能精确的控制对象释放的时间。
52 2.反之,对于占用内存小的,使用autorelease的影响比较小。
53
54 autorelease添加到那个池子:
55 1.通过栈的结构,我们可以很容易的理解,autorelease是添加到当前管理池子的栈
56 中栈顶得池子。
57
58
59 autorelease的常见错误(本质都是最终会多次调用release):
60 1.连续调用autorelease。
61 2.在自动释放池中有效范围中,同时条用了autorelease与release。
62
63
64 // 在啰嗦几句:
65 // 在ios运行中,系统会自动创建很多的池子,所以autorelease作用在
66 // 的池子,是指栈顶的池子。
67 //
68 //
69
70 */
71