1. 程式人生 > >oc 內存管理

oc 內存管理

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 內存管理