首页 > 代码库 > OC内存管理

OC内存管理

定义的属性,在赋值的时候最好使用setter方法,在取值的时候都可以,差别不大
 
 
 

便利构造器的内存释放(便利构造器创建的对象不用释放内存,里面自带内存释放)

第一种:
第二种
第三种:也是最常用最好的一种
第四种:
 
 
 
 // 内存管理原则四
        //谁污染谁治理,凡是你自己alloc,copy,retain的,需要你自己来处理,不是你干的,不需要你管
        //  集合对象(数组,字典,set(集合))会对他们管理的对象引用计数加一,当他们销毁时,会对他们管理的这些对象引用计数减一
// 使用便利构造器创建对象时,不需要对对象进行释放,便利构造器里面有autorelease

        Person * person = [[Person alloc] initWithName:@"张三" sex:@"男" age:20];
        NSLog(@"%lu", [person retainCount]);
        NSArray * array = [[NSArray alloc] initWithObjects:person, nil];
        [person release];
        [array release];
        NSLog(@"%lu", [array retainCount]);
        NSLog(@"%lu", [person retainCount]);
 
 
方法内部创建的对象:
//在方法里面创建的对象,首地址如果保存在局部变量中,那么在出方法之前一定要release或者autorelease掉
如果下面要使用方法里面创建的对象,可以对这个对象定义成一个属性
- (void)loadData
{
    //下面两种方法都可以使用,如果直接使用_array进行赋值,可能会有内存泄露
    self.array = [[[NSArray alloc] initWithObjects:@"A", @"B", @"C", nil] autorelease];
//    self.array = [NSArray arrayWithObjects:@"aa", @"vv", nil];
//    [_array release];
    NSLog(@"%@", _array);
//    [array autorelease ];

}
 
  //  内存管理的第一个原则,只要出现alloc,retain, copy地方都要有release或者atuorelease与之对应
 

 
 
 
//建类必备dealloc,只要声明retain或copy的属性,都要到dealloc  release一次
//先release  自己类属性生成的实例变量
// 再调用父类的dealloc
- (void)dealloc
{
    NSLog(@"被销毁了”);//非必要
    [super dealloc];
}
 
//建类必写
- (void)dealloc
{
    self.name = nil;
/*   //安全释放  等价于:  [_name release]; _name = nil;*/
    self.sex = nil;
    self.array = nil;
    [super dealloc];
}
 
 
 
 
 
自动释放池
     /*自动释放池的新写法*/
        @autoreleasepool {//自动释放池的工作原理
            //当对一个对象发送autorelease消息时,会把对象扔到离他最近的自动释放池中,当这个自动释放池销毁时,会对池中管理的autorelease对象逐一发送release消息
            /*自动释放池老的写法NSAutoreleasePool*/
            [stu1 retain];
            [stu2 retain];
            NSLog(@"%lu, %lu", [stu1 retainCount], [stu2 retainCount]);
            [stu1 autorelease];
            [stu2 autorelease];
            [stu1 autorelease];
            NSLog(@"%lu, %lu", [stu1 retainCount], [stu2 retainCount]);
           
        }

NSCopying协议必须实现
//NSZone用来记录源对象的内存存储信息
//当你对一个对象调用copy方法,那么会自动调用copyWithZone:  方法
- (id)copyWithZone:(NSZone *)zone
{
    Student * stu = [Student allocWithZone:zone];
    stu.name = self.name;
    stu.sex = self.sex;
    stu.age = self.age;
    return stu;
}
 

OC内存管理