首先搞清楚一個概念,地址:內存是由不少位組成的,每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方法。