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

OC内存管理

时间:2014-11-14 17:29:19      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:style   color   ar   使用   sp   div   on   log   bs   

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

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

第一种:bubuko.com,布布扣
第二种bubuko.com,布布扣
第三种:也是最常用最好的一种bubuko.com,布布扣
第四种:
bubuko.com,布布扣
 
 
 
 // 内存管理原则四
        //谁污染谁治理,凡是你自己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与之对应
 
bubuko.com,布布扣
 
bubuko.com,布布扣
 
 
//建类必备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内存管理

标签:style   color   ar   使用   sp   div   on   log   bs   

原文地址:http://www.cnblogs.com/long1234/p/4097407.html

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