A.ARC的基本原理函數
1.ARC的判斷原則:只有沒有強指針指向對象,就會當即釋放對象
注意,在如下狀況,會當即回收內存:
(1)指針超出做用域
1 {
2 Person *p1 = [[Personalloc] init];
3 p1.name = @"p1";
4 NSLog(@"1");
5 }// 超出p1做用域,回收p1指向的空間
6
7 NSLog(@"2");
out:
2014-11-21 00:14:59.980 01-autorelease
基本概念
[4282:263265] 1
2014-11-21 00:14:59.981 01-autorelease
基本概念
[4282:263265] Person - p1
被回收了
2014-11-21 00:14:59.981 01-autorelease
基本概念
[4282:263265] 2
(2)指針指向別的對象
1 Person *p1 = [[Personalloc] init];
2 NSLog(@"1");
3 p1.name = @"p1";
4 NSLog(@"2");
5 p1 = [[Personalloc] init]; // p1指向了別的對象,原來指向的內存空間被釋放
6 NSLog(@"3");
out:
2014-11-21 00:10:52.263 01-autorelease
基本概念
[4248:261439] 1
2014-11-21 00:10:52.264 01-autorelease
基本概念
[4248:261439] 2
2014-11-21 00:10:52.264 01-autorelease
基本概念
[4248:261439] Person - p1
被回收了
2014-11-21 00:10:52.264 01-autorelease
基本概念
[4248:261439] 3
2014-11-21 00:10:52.264 01-autorelease基本概念[4248:261439] Person - p2被回收了
(3)指針置nil
1 Person *p1 = [[Personalloc] init];
2 p1.name = @"p1";
3 NSLog(@"1");
4 p1 = nil; // p1被置爲nil,原來指向的內存空間被釋放
5 NSLog(@"2");
out:
2014-11-21 00:12:49.289 01-autorelease
基本概念
[4266:262528] 1
2014-11-21 00:12:49.291 01-autorelease
基本概念
[4266:262528] Person - p1
被回收了
2014-11-21 00:12:49.291 01-autorelease
基本概念
[4266:262528] 2
強弱指針:
(1)強指針:使用_strong修飾, 默認狀況下,全部指針都是強指針
(2)弱指針:使用_weak修飾
2.啓動了ARC以後,@property屬性不能使用retain了,retain用strong代替(不會報錯,效果weak等同assign, strong等同retain)
@property(nonatomic,strong)Dog*dog;
有strong和weak兩種指針類型能夠選擇
3.ARC的特色
(1)不容許調用release、retain、retainCount
(2)容許重寫dealloc,可是不容許調用[super dealloc],其實不重寫其成員對象也會自動被釋放
(3)@property參數
a.strong:成員變量是強指針,(適用於OC對象類型)
b.weak:成員變量是弱指針,(適用於OC對象類型)
c.assign:適用於非OC對象類型
—》之前的retain改成用strong
B.XCode的ARC轉換
1.重構轉換
Edit -> Refactor -> Convert to ARC for Objective c
自動消除掉函數、dealloc中的release代碼
2.手動指定不須要使用ARC的代碼文件
項目 -> Build Phase -> 雙擊代碼文件 -> 加入參數 「-fno-objc-arc」
參數:
(1)-fno-objc-arc:禁用ARC
(2)-f-objc-arc:開啓ARC
C.循環引用
互相使用strong引用的對象,不能被釋放
解決:其中一方使用weak引用,一方使用strong引用
——————Person.h———————
1 @classDog;
2 @interfacePerson :NSObject
3 @property(nonatomic,strong)Dog*dog;
4 @end
——————Dog.h————————
1 @classPerson;
2 @interfaceDog :NSObject
3 @property(nonatomic,weak)Person*person;
4 @end
對比非ARC的解決方案:一方使用retain,另外一方使用assign