Objective-C 【多个对象内存管理(野指针&内存泄漏)】

———————————————————————————————————————————

多个对象内存管理(野指针&内存泄漏)


(注:这一部分知识请结合“单个对象内存管理”去理解)


这一部分的知识比较简单,就牵扯到一个会产生野指针的情形和如何避免内存泄漏问题。

代码:

#import <Foundation/Foundation.h>

@interface Car : NSObject
-(void)run;
@end

@implementation Car

//监控Car对象有没有被释放
- (void)dealloc
{
    NSLog(@"Car dealloc!");
    [super dealloc];
}

-(void)run
{
    
    NSLog(@"Car run!");
}
@end

@interface Person : NSObject
{
    Car *_car;
    
}
-(void)driver;
-(void)setCar:(Car *)car;
@end

@implementation Person
- (void)dealloc
{
    [_car release];//_car 和 car指向的是同一块内存空间,所以说对这两个中任意一个执行释放内存的指令都是可以的。
    NSLog(@"Person dealloc!");
    [super dealloc];
}
-(void)driver
{
    [_car run];
}
-(void)setCar:(Car *)car
{
    [car retain];
    _car=car;
   
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Person *p=[Person new];//p   1
        
        Car *car=[Car new];//car   1
        
        [p setCar:car];//car   2
        //p.car=car;  这样写和上面是一样的~因为写了set方法所以我们可以写点语法
        
        [car release];//此时car释放    1
        
        [p driver];//p调用driver方法,里面会用到car这个实例变量去调用run方法,但是car在之前就已经被释放了,变为了野指针,所以说就会报错,那么应该怎么处理?显然我们可以在释放car之前retain一次,可以在setCar方法中对car对象进行retain,那样当car执行完set方法后计数就变为2。但是这样的话虽然不会报错,可是car的计数又变为了1,如果不进行适当操作,又会出现内存泄漏。所以这个方法只是暂时的。但是这句话目前可以执行不会报错。
        
        [p release];//我们在p的dealloc方法里面加了一个 [car release];  让car的内存释放,这样就不会出现内存泄漏了。此时p计数为0,car计数为0。
        

    }
    return 0;
}


———————————————————————————————————————————
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值