自動釋放池:
@autoreleasepool {
}
內存管理機制 誰污染,誰治理
垃圾回收機制:gc(Garbage collection),由系統管理內存,開發人員不需要管理.OC從版本2.0之後開始支持垃圾回收機制,但iOS開發平台不支持垃圾回收機制
繼承自NSObject的對象需要內存管理
OC中通過引用計數器管理內存
通過引用計數器管理內存的兩種方式
1.MRC:(maual reference count),手動引用計數,就是開發人員通過引用計數管理內存
2.ARC:(Automatic reference count),自動引用計數,由系統自動通過引用計數管理內存
ARC是基於MRC創建出來的
使用alloc生成對象的時候會將引用計數由0變為1
打印引用計數
retainCount:引用計數
打印retainCount 需要在ARC之下.
retainCount占4個字節
當retainCount變為0的時候,會自動調用dealloc方法.
-(void)dealloc{
NSLog(@"%@對象已經被銷毀",_name);
[superdealloc];//必須調用super的dealloc,且寫在最下面
}
僵屍對象:所占內存已經對回收的對象.僵屍對象不能再使用.
野指針:指向僵屍對象的指針.
空指針;沒有指向任何東西的指針(nil,NULL,0).如:per1=nil;
操作空指針不會報錯
alloc對應dealloc retain對應relase
autorelease和release的區別
1.autorelease相比release,也是對引用計數器執行減一操作,但不是立即減一,而是在未來的某個時刻減一(出了自動釋放池)
2.autorelease的實質;對一個對象使用autorelease操作,這個對象的引用計數不會立即減一,對象會被放到自動釋放池裡,待出了釋放池才減一
for (int i=0; i<1000000; i++) {
Person *person=[[Personalloc]init];//1
//數組會對添加的對象做一次引用計數+1
// 數組在釋放自己之前,會對之前添加的所有元素release操作(引用計數-1)
[array addObject:person];//2
[person release];//1
}
copy的使用:
對象使用copy的前提:這個類遵循了NSString ,且必須實現協議內的方法.
把某一內存區域的內容拷貝一份,拷貝到新的內存空間?去,被拷?區域的引?計數不變,新的內存區域的引用計數為1。
-(id)copyWithZone:(NSZone *)zone{
//淺拷貝:拷貝的是指針(地址)
// return [self retain];
//深拷貝:拷貝的是內容.
// 返回一個新的對象,跟原來的對象所占空間大小相同,空間內的內容也是相同的
Person *p=[[PersonallocWithZone:zone]init];
p.name=self.name;
return p;
}
new:申請內存並將retainCount從0變1
-------------------
//內存管理了原則
// +1:alloc,copy,new,retain
// -1:release,autorelease
// 一旦對象的引用計數器為0,系統會自動調用dealloc方法,之後就不能再對對象進行操作
// 誰污染誰治理
//自動釋放池的兩種形式
//1.
@autoreleasepool {
}
//2.自動釋放池的另一種形式(想當於自己建立的釋放池)
NSAutoreleasePool *pool=[[NSAutoreleasePoolalloc]init];
[pool release];