多對象內(nèi)存管理.m
1 //
2 // main.m
3 // 多對象內(nèi)存管理
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 如果你是開房間的人,那么騰訊服務(wù)器如何回收房間,這個房間對象通常有一個
32 人數(shù)變量。
33 當(dāng)你創(chuàng)建房間時候,初始值為1。當(dāng)你離開時候,房間人數(shù)減1,變成0、
34 所以房間所占用的內(nèi)存被回收。
35 當(dāng)有人進入房間時候,人數(shù)加1,當(dāng)他離開房間時候,人數(shù)也減1.
36
37 引用計數(shù)器的原理和其一樣。
38
39 多對象內(nèi)存管理原則:(先記住、可類比QQ糖例子理解)
40 1.誰創(chuàng)建,誰release
41 如果你通過alloc、new或[mutable]copy來創(chuàng)建一個對象,那么你必須調(diào)用release或者autorelease(
42 就如同QQ糖里面的,是你開的房間,那么初始人數(shù)是1,你離開房間,人數(shù)必須減1)
43 換句話說不是你創(chuàng)建的,就不用你去[auto]release
44 2.誰retain,誰release。
45 只要你調(diào)用了額retain,無論這個對象如何生成,你都要調(diào)用release。
46
47 */
48
Person.m
1 //
2 // Person.m
3 // 多對象內(nèi)存管理
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 // 多對象內(nèi)存管理
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