1

新しいiOS6をサポートするXCode4.5で奇妙な問題が発生しています。

ほとんどのアプリでは、便宜上、Stateクラスをどこからでもアクセスできるシングルトンとして作成していますが、最新のXCodeでは、非静的ポインターメンバーをオブジェクトに設定した後、割り当ての直後に値がに戻ったようです。ヌル。

さらに奇妙なことに、新しいプロジェクトを最初から開始した場合にのみ問題が発生し、以前のバージョンのXCodeで作成された古いプロジェクトをロードした場合には問題が発生しません。コンパイラの設定を調べましたが、すべて同じように見えます。この問題は、実際のデバイス(iOS6を実行しているiPhone4)でテストした場合にのみ発生します。シミュレーターはこの問題を示しません。

関連するコードは次のとおりです。

State.h

class State
{
public:

    State();
    ~State();

     static State& Get();

private:
    static State * s_state;

State.mm

State* State::s_state = nil;

State& State::Get()
{
    if(s_state==nil)
        s_state = new State();
    return *(s_state);
}

Stateに非静的メンバーがあると仮定した使用例Object*m_object:

void SomeClass::DoSomething()
{
    State::Get().SetObject( new Object() );

    // this will return null with newly created XCode 4.5 projects
    State::Get().GetObject();

**編集**スレッドセーフ性に関して、以下の2つのケースが「マルチスレッド」シナリオと見なされるかどうかを知りたいです。

openglループの表示リンクを使用するタイマーが1つあります

[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

そして、この方法で初期化したゲームロジックの更新を担当するタイマーが1つあります

timer = [NSTimer scheduledTimerWithTimeInterval:1.f/60.f target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:m_timer forMode:NSRunLoopCommonModes];

したがって、これらの両方のループからState :: Get()を呼び出すと、これはスレッド化されたシナリオと見なされますか?

ご協力ありがとうございました。-マーク

4

2 に答える 2

1

コードは問題ないように見えます(ただし、スレッドセーフではありません)。アクセサーは投稿しないので、実際に取得して設定する標準タイプだと思います。

つまり、推測することしかできませんが、問題の原因が、二重削除などの原因で以前に発生した破損したメモリであるかどうかを確認する価値があります。

ガードmallocを有効にして、再試行してください。valgrindを試すこともできます。

編集については、メインスレッドからaddToLoopコードを呼び出している限り(おそらくメインスレッドにあるviewDidLoadまたはinitコードで呼び出している)、両方のタイマーコールバック(タイマーと表示リンク)があるため、問題ありません。メインループで処理されます)。

于 2012-10-11T06:13:15.573 に答える
0

わかりました。私の問題が何であるかを知り、皆さんと共有したいと思いました。単一/静的クラスとは何の関係もありませんが、この種の問題はデバッグが難しい場合があります。

私のStateクラスでは、特定の構成でのみ使用可能なメンバーがありました。

#ifdef SOME_CONFIG
    int m_someValue;
#endif

この場合の問題は、コンパイル時にSOME_CONFIGが実際に定義されていたが、ターゲットの条件などに従って他の場所で未定義であったため、変数がスタックに存在するが、初期化/使用されなかったことなどです。ヘッダーに変数があるだけで、問題(それを使用して電話をかけなかった場合でも)。

これが誰かを助けることができることを願っています。

ありがとう。

于 2012-10-15T17:36:51.937 に答える