main.m
1 //
2 // main.m
3 // 循環(huán)引用與循環(huán)retain
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 "Card.h"
12
13
14
15 // 重點(diǎn)介紹循環(huán)retain,循環(huán)引用比較好理解
16 /*
17 循環(huán)引用:
18 當(dāng)兩個類的頭文件中都使用#import或者#include包含對方,就會照成循環(huán)引用。而會引發(fā)
19 編譯錯誤。如果是前者,則由于#import雖然不會導(dǎo)致死循環(huán),例如:A、B兩個頭文件相互
20 import,假設(shè)A先編譯好了,但到了B,因?yàn)锽在A中已經(jīng)import,你在B中import A時候,又
21 把B import進(jìn)來,但是B無法被import到自身,會導(dǎo)致其中一個無法被正常編譯。而后
22 #include就如同一個死循環(huán),所以也會出錯。
23
24 總結(jié):
25 @class的2點(diǎn)作用
26 1.用來在頭文件中前置聲明要用到的類,而不用導(dǎo)入頭文件,減少了要引用的文件,提高編譯效率。
27 2.用來解決循環(huán)引用導(dǎo)致編譯時出錯。
28 */
29
30 int main(int argc, const char * argv[]) {
31
32 Person *p = [[Person alloc] init];
33
34 Card *c = [[Card alloc] init];
35
36 // 相互retain、造成類似死鎖問題,導(dǎo)致兩個對象都不能被釋放。
37 // 解決辦法,破壞環(huán)。
38 // 如何破壞環(huán)呢,那么勢必有一個類中不能在使用retain
39 // 也就是說一個使用retain、一個使用assign就能夠成功解決這個問題。
40 p.card = c;
41 c.person = p;
42
43 [c release];
44 [p release];
45
46 return 0;
47 }
48
Person.h
1 //
2 // Person.h
3 // 循環(huán)引用與循環(huán)retain
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
11 @class Card;
12
13 @interface Person : NSObject
14
15 @property (nonatomic, retain) Card *card;
16
17 @end
18
Person.m
1
2 //
3 // Person.m
4 // 循環(huán)引用與循環(huán)retain
5 //
6 // Created by sixleaves on 15/5/9.
7 // Copyright (c) 2015年 itcast. All rights reserved.
8 //
9
10 #import "Person.h"
11 #import "Card.h"
12 @implementation Person
13
14 - (void)dealloc
15 {
16 [_card release];
17 [super dealloc];
18 }
19
20 @end
21
Card.h
1 //
2 // Card.h
3 // 循環(huán)引用與循環(huán)retain
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
11 @class Person;
12
13 @interface Card : NSObject
14
15 // 破壞環(huán)
16 @property (nonatomic, assign) Person *person;
17
18 @end
19
Card.m
1 //
2 // Card.m
3 // 循環(huán)引用與循環(huán)retain
4 //
5 // Created by sixleaves on 15/5/9.
6 // Copyright (c) 2015年 itcast. All rights reserved.
7 //
8
9 #import "Card.h"
10 #import "Person.h"
11 @implementation Card
12
13 - (void)dealloc
14 {
15 // 破壞環(huán)后,這邊就不用再release了。
16 //[_person release];
17
18 [super dealloc];
19 }
20
21 @end
22