内存管理高级

1、内存管理

1.1 不需要手工管理内存的情况

1.1.1、使用类方法创建的对象不需要我们管理计数器

1.1.2、放进容器类中的对象不需要我们管理计数器(对象进入容器自动retain,离开容器或容器被销毁自动release

如:使用类方法创建对象的情况:

 NSString *name = @"张三三";  // name是使用类方法(字面量相当于便立构造器,即类方法)创建的对象,不需要我们release

        // 便立构造器创建person2

        Person *person2 = [Person person:@"小虎"]; // person2 使用类方法创建的对象不需要我们release

        Person *person3 = [Person person:name];  // person3 使用类方法创建的对象不需要我们release


如:放进容器类中的对象:


1.2需要手工管理内存的情况  

使用alloc(计数器从0倒一)、copy(新对象的计数器加一)、retain(计数器加一)new(计数器从01)创建、引用的对象需要手工管理内存





2、容器类内存管理方式




        NSMutableArray *array = [NSMutableArray array]; // 使用类方法创建的对象会在出了释放池后,被系统自动释放

        Person *p1 = [[Person allocinit];

        NSLog(@"array = %ld", [array retainCount]); // 1

        NSLog(@"p1 = %ld", [p1 retainCount]);   // 1

        

        [array addObject:p1];   // p1加入容器中,容器自动进行一次retain

        NSLog(@"array = %ld", [array retainCount]); // 1

        NSLog(@"p1 = %ld", [p1 retainCount]);   // 2

        

        

        

        [array removeObject:p1];    // p1移出容器,容器自动将release

        NSLog(@"p1 = %ld", [p1 retainCount]);   // 1


        [p1 release];

        NSLog(@"p1 = %ld", [p1 retainCount]);   // 0




3、便利构造器的内存管理方式

return [p autorelease]是最完美的解决⽅案,既不会内存泄 露,也不会产⽣野指针。

如:

+ (instancetype)person:(NSString *)name

{

    Person *p = [[Person allocinitWithName:name];

    return [p autorelease]; // 便利构造器的内存管理方法:使用(autorelease:p出了releasepool时才释放对象p

}


4、dealloc的使用
4.1什么是dealloc?

4.1.1deallocNSObject的⼀个实例⽅方法,alloc对应,用于回收开辟的内 存空间

4.1.2这个⽅法在本类对象引⽤计数为0时,由系统⾃动调⽤用

4.1.3通常我们在dealloc中释放类的实例变量 

如:

// 当本类对象被释放的时候,会走dealloc方法

// 在方法内,需要release一次属性语义设置词是retain或者copy的属性

- (void)dealloc 

{

   

    [_name release];      // 释放setter方法造成的_name属性的内存泄漏  

    [super dealloc];    // 调用从父类继承过来的dealloc方法

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值