美文网首页
iOSMRC手动释放对象野指针问题

iOSMRC手动释放对象野指针问题

作者: struggle3g | 来源:发表于2019-03-07 20:54 被阅读0次

在手动使用的时候有可能会遇到野指针问题,比如下面例子:

    ************************************************************
    /***   DogModel.h ***/
    ************************************************************
    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    @interface DogModel : NSObject
    
    @property(nonatomic,copy)NSString *dogName;
    
    -(void)doing;
    
    @end
    
    NS_ASSUME_NONNULL_END
    
    ************************************************************
    /***   DogModel.m ***/
    ************************************************************
    #import "DogModel.h"
    @implementation DogModel
    -(void)doing{
        NSLog(@"%@ 会汪汪汪!",self.dogName);
    }
    -(void)dealloc{
        NSLog(@"DogModel = (%@)dealloc method.",self.dogName);
        [super dealloc];
    }
    @end
    
    
    ************************************************************
    /***   UserModel.h ***/
    ************************************************************
    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @class DogModel;
    
    @interface UserModel : NSObject
    
    @property(nonatomic,copy)NSString *UserName;
    
    - (void)setDog:(DogModel *) dog;
    -(DogModel*)Dog;
    
    @end
    
    NS_ASSUME_NONNULL_END
    ************************************************************
    /***   UserModel.m ***/
    ************************************************************
    #import "UserModel.h"
    
    @interface UserModel ()
    {
        DogModel *_Dog;
    }
    @end
    
    
    @implementation UserModel
    
    
    - (void)setDog:(DogModel *)dog{
         _Dog = dog;  
    }
    
    -(DogModel*)Dog{
        return _Dog;
    }
    
    -(void)dealloc{
        NSLog(@"UserModel = (%@)dealloc method.",self.UserName);
        [_Dog release];
        _Dog = nil;
        [super dealloc];
    }
    
    @end

    ************************************************************
    /***   调用代码 ***/
    ************************************************************
    UserModel *user = [[UserModel alloc]init];
    user.UserName = @"struggle";
        
    DogModel *dog=[[DogModel alloc]init];
    dog.dogName=@"小黑";
        
    user.Dog=dog;
        
    [dog release];
    dog=nil;
    
    [user.Dog doing];    
    [user release];
    user = nil;

抛出异常

Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
经过调试发现是野指针的问题,主要是下面两段代码出的问题。

/***   调用代码 ***/
UserModel *user = [[UserModel alloc]init];
user.UserName = @"struggle";
DogModel *dog=[[DogModel alloc]init];  //dog retainCount == 1
dog.dogName=@"小黑";                   
user.Dog=dog;    //user.Dog retainCount == 1    
[dog release];   //user.Dog、dog retainCount == 1
dog=nil;
[user.Dog doing];
/***   UserModel.m ***/
- (void)setDog:(DogModel *)dog{
     _Dog = dog;  
}

当创建一个新的DogModel的实例变量 dog直接赋值给了user.Dog其真正目的只是给了user.Dog一个指针,user.Dog跟dog对应的内存空间是一样的。并且retainCount的值时1,当[dog release]后,retainCount = 0,这个对象也就释放掉了,而user.Dog实际上已经是一个野指针了。

解决方案
/***   UserModel.m ***/
- (void)setDog:(DogModel *)dog{
     if(_Dog != dog){
        [_Dog release];
        _Dog = [dog retain];
     }
}

这个方法,跟property中的(retain)是一样的

相关文章

  • iOSMRC手动释放对象野指针问题

    在手动使用的时候有可能会遇到野指针问题,比如下面例子: 抛出异常 Thread 1: EXC_BAD_ACCESS...

  • OC总结(二)

    一.内存问题(1).内存溢出(2).野指针(过度释放)二.内存管理方式: (1)MRC:手动管理引用计数.对对象完...

  • C++ 智能指针

    智能指针 传统指针存在的问题需要手动管理内存容易发生内存泄露(忘记释放,出现异常等)释放之后产生野指针 智能指针就...

  • 597,iOS 野指针和僵尸对象,IOS系统中对僵尸对象是怎么做

    野指针:指针指向的对象已经被回收掉了。这个指针就叫做野指针。僵尸对象:一个已经被释放的对象 就叫做僵尸对象 OC中...

  • iOS 常见面试题总结

    1. 空指针、野指针以及僵尸对象的理解,如何避免野指针错误。解答:内存被释放的对象为僵尸对象(不能再使用的对象)。...

  • 如何检测野指针?

    啥是野指针? 指向一个已经删除的对象或未申请访问受限内存区域的指针。而这里的野指针主要是指对象释放后,指针未置空导...

  • iOS如何调试BAD_ACCESS错误、定位崩溃位置

    写项目过程中经常遇到一些空指针或者僵尸对象问题,类似访问了野指针,比如对一个已经释放的对象执行了release、访...

  • 内存管理

    1.僵尸对象、野指针、空指针分别指什么,有什么区别? 野指针:指针变量没有进行初始化或指向的空间已经被释放。 使用...

  • Thread1:EXC_BAD_ACCESS 错误

    描述:野指针,在对象被释放之后又调用了该对象 场景:在某个UIVIewController释放之后有调用了该Con...

  • 野指针 Crash

    野指针是指指向一个已删除的对象或未申请访问受限内存区域的指针。本文说的Obj-C野指针,说的是Obj-C对象释放之...

网友评论

      本文标题:iOSMRC手动释放对象野指针问题

      本文链接:https://www.haomeiwen.com/subject/ojzhpqtx.html