码迷,mamicode.com
首页 > 其他好文 > 详细

oc 内存管理

时间:2019-02-18 14:40:49      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:创建   .com   资源   return   page   lease   声明   with   使用   

内存管理的两种方式:

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

标签:创建   .com   资源   return   page   lease   声明   with   使用   

原文地址:https://www.cnblogs.com/kinghyt/p/10394997.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!