//垃圾回收机制:由系统自己管理内存,例如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 要对用retain和copy修饰的属性进行释放- (void)dealloc{ NSLog(@"系统收回内存"); //1 [_name release]; _name = nil; //2 // = 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]; }}