0

そのため、古い .cpp ファイルに機能を追加する必要があります。これは巨大です。したがって、Objective C で書き直すことはできません。代わりに、Objective-C を使用して必要な機能を追加しました (多くの NSDate/NSDateFormatter 関数が必要なため)。うまくいきました。しかし、(私のView Controllerで)ゲッターを呼び出すと、次のエラーが発生します: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 対応としてコンパイルされます。この問題は、メンバー 'startTime' が ARC によって解放され、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 のブレークポイントを確認してください...日付の割り当てがいつ解除されるか、適切かどうか、またはその仮説を除外することができるはずです。

私の頭をよぎったもう 1 つの考えは、行方不明のコピー コンストラクターです。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;
}
于 2012-06-20T21:08:11.327 に答える