Objective c 在C+中使用NSDate执行错误访问+;档案,为什么?

Objective c 在C+中使用NSDate执行错误访问+;档案,为什么?,objective-c,memory-management,memory-leaks,objective-c++,Objective C,Memory Management,Memory Leaks,Objective C++,所以,我必须在一个旧的.cpp文件中添加一个功能。它太大了。因此,在目标C中重写它不是一个选项。相反,我使用Objective-C添加了必要的功能(因为我需要很多NSDate/NSDateFormatter函数)。它工作得很好。但是,当调用getter(在我的视图控制器上)时,我得到了这个错误:EXC\u BAD\u ACCESS 下面是一段代码: //.h file ----------------- // C/C++ headers #import <Foundation/NSDat

所以,我必须在一个旧的.cpp文件中添加一个功能。它太大了。因此,在目标C中重写它不是一个选项。相反,我使用Objective-C添加了必要的功能(因为我需要很多NSDate/NSDateFormatter函数)。它工作得很好。但是,当调用getter(在我的视图控制器上)时,我得到了这个错误:EXC\u BAD\u ACCESS

下面是一段代码:

//.h file  -----------------
// C/C++ headers
#import <Foundation/NSDate.h>
#import <Foundation/NSDateFormatter.h>

namespace MySpace {
    class Session {
        private:
            // C++ stuff
            NSDate * startTime;
        public:
            // C++ stuff
            NSDate * getStartTime();
            Session(NSDate * startTime );
    };
}

// .cpp file -----------------
using namespace MySpace;
Session:Session (NSDate * startTime) {
    // unrelated code
    if (startTime == nil ){
        startTime = [NSDate date];
    }
    setStartTime( startTime);
    // unrelated code
}

void Session::setStartTime( NSDate * startTime){
    this->startTime = [startTime copy];
}

NSDate * Session::getStartTime() {
    return this->startTime; // here I get the EXC_BAD_ACCESS
}
/.h文件-----------------
//C/C++头文件
#进口
#进口
命名空间MySpace{
课堂{
私人:
//C++
NSDate*开始时间;
公众:
//C++
NSDate*getStartTime();
会话(NSDate*startTime);
};
}
//.cpp文件-----------------
使用名称空间MySpace;
会话:会话(NSDate*startTime){
//无关代码
if(startTime==nil){
开始时间=[NSDate date];
}
设置开始时间(开始时间);
//无关代码
}
无效会话::设置开始时间(NSDate*startTime){
此->开始时间=[startTime copy];
}
NSDate*会话::getStartTime(){
return this->startTime;//这里我得到了EXC\u BAD\u访问权限
}
整个项目编译为Objective-C++并启用了ARC。我相信这个问题是因为成员“startTime”是由ARC释放的,当我调用getter时,它指向nil

我怎样才能解决这个问题

谢谢。

试试:

NSDate * Session::getStartTime() {
    if (this == NULL) return nil;
    return this->startTime; // here I get the EXC_BAD_ACCESS
}
此更改使getStartTime不受此指针的NULL值的影响

这有帮助吗?如果是这样,那么在某个地方,您正在使用一个悬空会话*指针

步骤2

不是那样。然后:

@interface MyNSDate: NSDate
@end

@implementation MyNSDate

- (id) init
{
    self = [super init];
    if ( self == nil ) return nil;

    NSLog( @"MyNSDate %@ initialized", self );

    return self;
}

- (void) dealloc
{
    // ARC: no super call
    NSLog( @"MyNSDate %@ deallocated", self );
}

@end
并将类中的NSDate*替换为MyNSDate。检查dealloc中的消息、断点。。。你应该能够知道何时解除分配日期,合适与否,或者排除该假设

我脑海中闪过的另一个想法是丢失的副本构造函数。如果在ARC编译单元和非ARC编译单元之间复制会话,它可能会中断。你不应该这么做,但嘿,这是常有的事

Session::Session( const Session& rhs )
{
    this->startTime = [rhs.startTime copy];
}

Session& Session::operator=( const Session& rhs )
{
    if ( this->startTime != rhs.startTime )
    {
        this->startTime = [rhs.startTime copy];
    }

    return *this;
}

我试过了。不,当试图返回此->开始时间时,它会停止。同样的问题:EXC_BAD_accessew。那好吧。给我的答案加上一点东西。试一试,选择2是最好的选择。有趣的事实:这门课没有任何问题,问题是由打电话的人提出的。有人延长了一个临时物体的寿命然后。。。它超出了范围,导致了这个问题。这里有更多信息:顺便问一下,一个问题,“这个”什么时候会为空。行:如果(this==NULL)返回nil;感谢您出现了严重的访问错误,我认为
Session
指针是
NULL
,即
Session*Session=NULL
紧接着是
session->getStartTime()。在这种情况下,
这个
getStartTime
中将是
NULL
,因为
getStartTime
不是虚拟的。