oc 內存管理
阿新 • • 發佈:2019-02-18
lec 程序 返回 需要 http person nil spa img
內存管理的兩種方式:
1、MRR 手動管理
2.ARC 自動管理
兩種內存管理常見的問題:
1、釋放了或者重寫了正在使用的數據 程序崩潰
2、沒有釋放不需要的對象 內存泄露
擁有權在實際操作中的體現:
MRR環境:
1、在某個代碼塊中創建的對象 代碼塊對其擁有權
-(void)test1{
NSString * t=[NSString new];
[t release]; //該代碼塊對t擁有擁有權 }
創建的關鍵字:alloc、new、mutablecopy、newobject、copy
對於無這些關鍵字的對象,系統對其有擁有權
不是自己創建的對象可以使用retain來獲得擁有權
NSString *t=[@"jack" retain]; [t release];
屬性聲明擁有權可以使用retain和strong
@property(nonatomic,strong) NSString *tt;
2、
在某個類的頭文件創建的對象
其擁有權是該類的某個對象的
@interface Person : NSObject //這個類的某個對象對copy的對象op擁有擁有權 @property(nonatomic,copy) NSString*op; @end
不再使用的對象應使用release 或者autorelease釋放掉
-(NSString *)test2{ NSString *str=[[[NSString alloc]initWithString:@"小王"]autorelease]; //1.不行 還沒返回就釋放 返回值為nil //[str release]; return str; //2.return之後不再執行之後的代碼 並沒有釋放 // [str release]; } -(void)test3{ NSString *str1=[self test2]; //3.不行 不是自己創建的對象就不能釋放 // [str1 release]; }
使用dealloc釋放掉一個對象所有的資源(當一個對象的引用計數為0 系統會自動調用dealloc去釋放該對象的所有資源 以免內存泄漏)
該對象有一個屬性name:
重寫dealloc方法:
- (void)dealloc { //釋放該對象對name的擁有權 [self.name release]; //調用父類方法 [super dealloc]; }
當兩個類中的對象互相使用強引用 會造成循環引用 致使對象無法釋放
@property(nonatomic,strong) Page*pag;
@property(nonatomic,strong) Document *doc;
Page *pa=[Page new];//pa:retaincount = 1 Document *docu =[Document new];//docu:retaincount =1 pa.doc = docu;//docu:retaincount = 2; docu.pag=pa;//pa:retaincount = 2; [pa release];//retaincount =1 [docu release];//retaincount = 1 //由於pa docu始終存在相互引用的關系 且兩者引用計數為一 均無法使用dealloc來釋放彼此
此時 使用weak避免循環引用:
@property(nonatomic,strong) Page*pag;
@property(nonatomic,weak) Document *doc;
Page *pa=[Page new];//pa:retaincount = 1 Document *docu =[Document new];//docu:retaincount =1 pa.doc = docu;//docu:retaincount = 1; docu.pag=pa;//pa:retaincount = 2; [pa release];//retaincount =0 docu:retaincount= 1 [docu release];//retaincount = 0 //此時全部被釋放
oc 內存管理