1 //
2 // main.m
3 // ARC基本原理
4 //
5 // Created by sixleaves on 15/5/12.
6 // Copyright (c) 2015年 itcast. All rights reserved.
7 //
8
9 #import <Foundation/Foundation.h>
10 #import "Person.h"
11 #import "Dog.h"
12 void test1();
13 void test2();
14 int main(int argc, const char * argv[]) {
15
16 //test1();
17 test2();
18
19 return 0;
20 }
21
22 void test1() {
23
24 Person *p = [[Person alloc] init];
25
26 __weak Person *p2 = p;
27
28 p = nil; // 在這行運(yùn)行后,Person就被釋放
29 /*
30 因?yàn)樵?7行,我們清空了指針p,就沒有強(qiáng)指針指向,Person對象
31 所以,27行一運(yùn)行結(jié)束,Person對象就會(huì)被釋放。雖然有p2指向Person
32 對象,但是p2是弱指針。淡然如果把__weak去掉,默認(rèn)是__strong,則
33 運(yùn)行完27行后,Person對象還不會(huì)被釋放。
34 */
35
36 NSLog(@"test1");
37 }
38
39 void test2() {
40
41 Person *p = [[Person alloc] init];
42
43 Dog * d = [[Dog alloc] init];
44
45 p.dog = d;
46
47 d = nil; // 這行運(yùn)行結(jié)束后,狗不會(huì)被釋放,因?yàn)閜對象中還有個(gè)強(qiáng)指針,指向狗對象。
48
49 NSLog(@"test2");
50
51 p = nil;
52
53 NSLog(@"All-dealloc");
54 /*
55 這行執(zhí)行完后,由于沒有強(qiáng)指針指向Person對象
56 所以,Person對象會(huì)被釋放,并且會(huì)銷毀掉Person
57 對象中擁有的對象(Dog的指針變量)。所以就沒有強(qiáng)指針
58 指向dog,所以Dog對象也會(huì)被銷毀。
59 */
60
61 }
62
63 /*
64 ARC釋放對象的判斷準(zhǔn)則: 只要沒有強(qiáng)指針指向?qū)ο螅蜁?huì)銷毀對象。
65
66 ARC的特點(diǎn)
67 1> 不允許調(diào)用release、retain、retainCount
68 2> 允許重寫dealloc,但是允許調(diào)用[super dealloc]
69 3> @property參數(shù)
70 strong:相當(dāng)于retain(適用于OC對象)
71 weak:相當(dāng)于assign(適用于OC對象)
72 assign:適用于非OC對象
73 4> 用strong替換retain
74
75 指針分2種:
76 1>強(qiáng)指針:默認(rèn)情況下,所有的指針都是強(qiáng)指針.(默認(rèn)用__strong修飾)
77 2>弱指針:__weak
78
79 Tips:如果你想持有對象,那么就用強(qiáng)指針,如果不想持有對象,就用弱只這么。
80
81 常見錯(cuò)誤:
82 __weak Perosn *p = [[Person alloc] init];
83 //這種錯(cuò)誤是沒有理解ARC釋放對象的判斷準(zhǔn)則。沒有強(qiáng)指針指向Person對象,
84 一創(chuàng)建就會(huì)被釋放。
85
86
87 掌握:
88 1.ARC釋放對象的判斷準(zhǔn)則
89 2.ARC的四個(gè)特點(diǎn)
90 3.強(qiáng)指針與弱指針的概念
91 4.常見錯(cuò)誤
92 */
93