多对象内存管理.m
1 //
2 // main.m
3 // 多对象内存管理
4 //
5 // Created by sixleaves on 15/5/7.
6 // Copyright (c) 2015年 itcast. All rights reserved.
7 //
8
9 #import <Foundation/Foundation.h>
10 #import "Person.h"
11 #import "Book.h"
12
13 int main(int argc, const char * argv[]) {
14
15 // p-1
16 Person *p1 = [[Person alloc] init];
17 // b-1
18 Book *b = [[Book alloc] init];
19
20 // b-2
21 [p1 setBook:b];
22 // b-1
23 [b release];
24
25 // p-0
26 [p1 release];
27 return 0;
28 }
29 /*
30 QQ糖的例子:
31 如果你是开房间的人,那么腾讯服务器如何回收房间,这个房间对象通常有一个
32 人数变量。
33 当你创建房间时候,初始值为1。当你离开时候,房间人数减1,变成0、
34 所以房间所占用的内存被回收。
35 当有人进入房间时候,人数加1,当他离开房间时候,人数也减1.
36
37 引用计数器的原理和其一样。
38
39 多对象内存管理原则:(先记住、可类比QQ糖例子理解)
40 1.谁创建,谁release
41 如果你通过alloc、new或[mutable]copy来创建一个对象,那么你必须调用release或者autorelease(
42 就如同QQ糖里面的,是你开的房间,那么初始人数是1,你离开房间,人数必须减1)
43 换句话说不是你创建的,就不用你去[auto]release
44 2.谁retain,谁release。
45 只要你调用了额retain,无论这个对象如何生成,你都要调用release。
46
47 */
48
Person.m
1 //
2 // Person.m
3 // 多对象内存管理
4 //
5 // Created by sixleaves on 15/5/7.
6 // Copyright (c) 2015年 itcast. All rights reserved.
7 //
8
9 #import "Person.h"
10 #import "Book.h"
11 @implementation Person
12 - (void)setBook:(Book*)book
13 {
14 _book = [book retain];
15 }
16 - (Book *)book
17 {
18 return _book;
19 }
20
21 - (void)dealloc
22 {
23 // b-0
24 [_book release];
25 NSLog(@"Person-dealloc");
26 [super dealloc];
27 }
28 @end
29
Book.m
1 //
2 // Book.m
3 // 多对象内存管理
4 //
5 // Created by sixleaves on 15/5/7.
6 // Copyright (c) 2015年 itcast. All rights reserved.
7 //
8
9 #import "Book.h"
10
11 @implementation Book
12 - (void)setPrice:(int)price
13 {
14 _price = price;
15 }
16 - (int)price
17 {
18 return _price;
19 }
20
21 - (void)dealloc
22 {
23
24 NSLog(@"Book-dealloc");
25 [super dealloc];
26 }
27 @end
28