0

所以,我必须在旧的 .cpp 文件中添加一个功能。它很大。所以用Objective C重写它不是一种选择。相反,我使用 Objective-C 添加了必要的功能(因为我需要很多 NSDate/NSDateFormatter 函数)。它工作得很好。但是,当调用 getter(在我的视图控制器上)时,我收到此错误:EXC_BAD_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
}

整个项目编译为 Objective-C++ 并启用了 ARC。我相信这个问题是因为ARC释放了成员'startTime',并且当我调用getter时,它指向nil?

我该如何解决这个问题?

谢谢。

4

1 回答 1

1

试试看:

NSDate * Session::getStartTime() {
    if (this == NULL) return nil;
    return this->startTime; // here I get the EXC_BAD_ACCESS
}

更改使 getStartTime 不受 NULL this 指针的影响。

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

第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::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;
}
于 2012-06-20T21:08:11.327 回答