新しい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()を呼び出すと、これはスレッド化されたシナリオと見なされますか?
ご協力ありがとうございました。-マーク