iOS開發---內存管理

c語言中 變量 和 指針 的區別:

首先搞清楚一個概念,地址:內存是由不少位組成的,每8位是一個字節,而每個字節都有一個名字(能夠看做門牌號),這個名字就是這一字節內存的地址。atom

  int a = 10;  //在棧區,申請一塊內存(4個字節,也就是32位),存放數字10,a是這塊內存的別名。spa

  a = 20;  //a表明的是上面申請的4個字節的內存,也就是在這塊內存 存放數字20,數字10被覆蓋。指針

  int *p = &a;  //在棧區,申請一塊內存,存放變量a的地址(&是取地址符,取的是a的4個字節中第一個字節的門牌號),               p是這塊內存的別名。而此時,這塊內存中存放的是地址,因此此時p變量就是一個指針。(也就是說,                存放地址的內存的別名就是指針)code

  *p = 30;  //*是取值符,從p表明的地址開始,日後取夠4個字節的內存,此時取到的就是a表明的內存。而後存放                   數字30,因此,此時a表明的內存存放的是數字30。blog

OC內存管理內存

若是有過MRC開發經驗,內存管理相對簡單。可是如今不少剛入行一兩年的iOS開發人員,基本都是ARC開發,對內存管理的理解就沒那麼透徹。因此,先寫一個MRC環境下demo:開發

 1 #import "ViewController.h"
 2 
 3 #import "Person.h"
 4 
 5 @interface ViewController ()
 6 
 7 @property (nonatomic,assign)Person *person;// ⚠️ 我這裏 用的關鍵字是 assign
 8 
 9 @end
10 
11 @implementation ViewController
12 - (void)viewDidLoad {
13     
14     self.person = [[Person alloc] init];
15     
16     NSLog(@"%zd",_person.retainCount);//結果是 2
17     
18     [_person release];
19     
20     NSLog(@"%zd",_person.retainCount);//結果是 1
21 }
22 
23 //我重寫了setter方法
24 - (void)setPerson:(Person *)person{
25 
26     if (_person != person) {
27         [_person release];
28         
29         _person = [person retain];
30     }
31 }
32 
33 @end

 

由打印結果能夠看出來,我雖然用的關鍵字是assign,可是當我使用self.person賦值的時候,仍是產生了強引用,和retain同樣的效果。這是由於,我重寫了setter方法。用關鍵字assign,他自動生成的setter方法應該是直接賦值it

- (void)setPerson:(Person *)person{內存管理

    _person = person;io

}

我重寫setter方法以後,其實就變成了強引用。因此,咱們在聲明屬性的時候,使用不一樣關鍵字自動生成的setter方法的實現不一樣。強弱引用是在setter方法裏體現的。

 

如今,我把程序改一下:

 

@property (nonatomic,retain)Person *person;// 我這裏 使用關鍵字 retain 

 

@implementation ViewController

 

- (void)viewDidLoad {

 

    _person = [[Person alloc] init];

 

    NSLog(@"%zd",_person.retainCount);//結果是 多少。。。

 

}

 

結果是1,此時沒有強引用,由於我賦值的時候,用的是_person,沒有用到setter方法。

相關文章
相關標籤/搜索