taiyang2014

内存管理

        //垃圾回收机制:由系统自己管理内存,例如java
        //OC2.0开始支持垃圾回收机制
        //iOS不支持垃圾回收机制
    
        //iOS是通过引用计数来管理内存
        //引用计数是为0,代表此块内存可以被申请到
        //引用计数不为0,代表此块内存正在被占用
        //引用计数+1代表拥有这块内存
        //引用计数-1,代表释放拥有权,当运用计数-1后为0,系统回收内存
        //:对于没有拥有权或者系统收回的内存,不能进行操作

        //**开发人员管理的内存,应该是堆区的内存
    
        //和引用计数相关的方法
        //+alloc:类方法,从堆区申请引用计数为0的内存,然后把引用计数置为1

        retain:实例方法,把该内存的引用计数+1

        release:实例方法,把该内存的引用计数-1

     
        //autorelease:实例方法,把该内存的引用计数,在未来的某个时刻-1
        //:一般会把代码写在自动释放池中,来保证autorelease操作的内存,能够得到释放

        //自定义类做copy----(深拷贝- 拷贝指针+内容)
        //-copy:copy的对象,必须遵循NSCopying协议,实现copyWithNone:方法,copy对引用计数的影响取决于copyWithNone:方法的实现

        //对系统类的copy
        //-copy:拷贝了一个指针,指向该内存区域,并把引用计数+1(浅拷贝-拷贝指针)

        //内存管理原则
        //1.有加必有减,终极目标为0
        //alloc,retain,copy的次数 release,autorelease的次数相同;保证内存使用结束后,及时的释放内存
        //2.谁创建,谁管理,谁增加,谁释放

 

    //当引用计数为0,进入这个方法,系统收回内存
    //初始化,先初始化父类,再初始化子类
    //销毁时,先销毁子类,再销毁父类

    //dealloc 要对用retaincopy修饰的属性进行释放
- (void)dealloc
{
    NSLog(@"系统收回内存");
        //1
    [_name release];
    _name = nil;
        //2
        //    self.name = nil;
    
    [_type release];
    _type = nil;
    
    [super dealloc];
}

 

- (void)setName:(NSString *)name
    //判断新传入的值和之前一样不一样
    //不一样的话,再赋值,来加快执行的效率,降低消耗
{
        //1
//    if (_name != name) {
//        
//        [name retain];//+1,拥有这个新值
//        [_name release];//-1,释放旧的值
//        _name = name;
//    }
        //2
    if (_name != name) {
        [_name release];
        _name = [name retain];
    }
}

 

 

 

 

 

posted on 2015-03-02 19:38  taiyang2014  阅读(172)  评论(0编辑  收藏  举报

导航