MRC内存管理1

野指针和内存泄露

// 1.内存泄露
        
        Person *person = [[Person alloc]init]; // 1
        NSLog(@"person count = %ld",person.retainCount);
        
        [person retain]; // 2
        
        Person *person1 = [person retain]; // 3
        
        [person release];// 2
        [person1 release];// 1
        
        // 配对原则
        // 对象的retainCount != 0的时候 不会调用dealloc方法
        // 函数销毁对象,对象会一直存在内存中造成内存泄露
           
// 2.内存泄露
        
        Person *person2 = [[Person alloc]init];
        person2 = nil;
//        [person release];
        NSLog(@"person2 --- = %ld",[person2 retainCount]); // 0

// 3.野指针
        Person *person3 = [[Person alloc]init];
        NSLog(@"person3 count = %ld",person3.retainCount);
  
        Person *person4 = [person3 retain];

        [person3 release];
        [person4 release];
        
//        NSLog(@"person3 count = %ld",person3.retainCount);
        // 打印野指针的retainCount
        person3 = nil;
        person4 = nil;
        
        [person3 run]; // [nil run];
        // 对象访问了不可访问的空间

 // 4.
        // 在一个对象调用dealloc 函数销毁之后
        //  是不会起死回生的
        Person *person5 = [[Person alloc]init];
        [person5 release];
        // EXC_BAD_ACCESS 访问了不可访问的内存空间
        [person5 retain];


 // 单个对象的内存管理
        Person *person = [[Person alloc]init];
        NSString *string = [NSString stringWithFormat:@"hello world"];
        person.name = string;
        person.age = 21;
        NSLog(@"%@",person);
        NSLog(@"%ld",[person.name retainCount]);
        
//        [string release];
        
        // NSString *string = @"test";
//        不需要释放,属于常量类型,程序会把这部分数据放到全局变量存储区
        
        // NSString *string1 = [NSString stringWithFormat:@"test"];
//        种类型生成的NSString是autorelease类型的变量,不需要释放,程序一次runLoop结束后就会释放。
        
        // NSString *string2 = [[NSString alloc]initWithFormat:@"test"];
//        这种类型的需要释放,因为alloc过了,需要手动用release释放,
        
        NSLog(@"%p %p",[person name],string);
        [person release];
        NSLog(@"%ld ",string.retainCount);
        person = nil;
        
    }



setter方法的内存管理

- (void)setCar:(Car *)car {
    
    if (car != _car) {
        [_car release]; // 第一次为nil release没事
        ///在setCar 的时候让car的retainCount+1 拿到car的强引用
        _car = [car retain];
        
    }
    
}


- (void)dealloc {
    [super dealloc];
    // 保证person对象销毁的时候,它所强引用的car也被销毁,防止出现内存泄露
    [_car release];
    NSLog(@"person is dealloc");
}

循环引用

  /*
          与@property内存管理有关的参数
         
         retain         生成符合内存管理原则的set方法
         assign         直接赋值,不考虑内存管理
         nonatomic      不生成多线程相关的代码
         
         readonly       只生成getter方法
         readwrite      生成getter和setter方法
         @property (nonatomic,assign,setter = isVip:,getter = isVip) BOOL isVip;
         */

@property (nonatomic,retain) Car *car;
// 如果重写了setter和getter方法,property就不会再生成 _car
// 需要自己声明成员变量 _car 在 .h中 或者  在@synthesize 后面

// 如果程序中出现了相互引用问题,那么一端一定要改成弱引用方式
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值