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