1

Androidで開始したCocos2d-xv2プラットフォームでゲームを開発しました。Eclipseでのコーディングを完全に終了した後、Xcodeで同じコードを使用してiOSバージョンを作成しました。必要なライブラリをすべて追加した後、コードのコンパイルに成功しました。ただし、Androidでは問題なく実行されますが、iOSデバイスで実行するとゲームはハングします。エミュレータとiPodの両方を試しましたが、静的メソッドから静的メンバーにアクセスすると、常にEXC_BAD_ACCESSが発生します。静的メンバーは常に0x0を指します!! コードからの抜粋は次のとおりです:\

AppDelegate.cpp

#include "AppDelegate.h"
#include "NASEncData.h"
AppDelegate::AppDelegate()
{
    ep = NASEncData::sharedUserData();
}

NASEncData.h

namespace CocosNas
{
    class NASEncData : public CCObject
    {
public:
        static NASEncData* sharedUserData();

private:
        NASEncData();

        static void initXMLFilePath();

        static std::string m_sFilePath;
    }
}

NASEncData.cpp

#include "NASEncData.h"


NASEncData* NASEncData::sharedUserData()
{
    initXMLFilePath();

    // only create xml file one time
    // the file exists after the programe exit
    if ((! isXMLFileExist()) && (! createXMLFile()))
    {
        return NULL;
    }

    if (! m_spUserData)
    {
        m_spUserData = new NASEncData();
    }

    return m_spUserData;
}

void NASEncData::initXMLFilePath()
{
    if (! m_sbIsFilePathInitialized)
    {
        m_sFilePath += CCFileUtils::sharedFileUtils()->getWriteablePath() + NASENCDATA_XML_FILE_NAME;                  <----error happens here
        m_sbIsFilePathInitialized = true;
    }   
}
4

2 に答える 2

0

質問に対するコメントに基づいて、問題は静的データの初期化順序である可能性があります。AppDelegateより具体的には、静的インスタンスが の静的メンバーの前に作成および初期化される可能性があると思いますNASEncData。また、この問題は、無関係な静的データの初期化順序がコンパイラとリンカーに依存するため、異なるプラットフォームで異なる動作が見られるという事実を説明することもできます。

これを修正するには、次のように変更することができますNASEncData:静的メンバーに依存する必要はありません。)

NASEncData.h

namespace CocosNas
{
    class NASEncData : public CCObject
    {
    public:
        static NASEncData* sharedUserData();

    private:
        NASEncData();

        static void initXMLFilePath();

        // Note how the stuff below this line have changed
        struct StaticData
        {
            std::string m_sFilePath;
            // Put other static members here
            //   (e.g. m_sbIsFilePathInitialized, m_spUserData, etc.)
            // Put a proper constructor here if needed
        };

        static StaticData & getStaticData ()
        {
            static StaticData s_data;
            return s_data;
        }
    }
}

NASEncData.cpp

void NASEncData::initXMLFilePath()
{
    if (! m_sbIsFilePathInitialized)
    {
        // Note the change in accessing m_sFilePath
        // You should access all your static members like this
        getStaticData().m_sFilePath +=
            CCFileUtils::sharedFileUtils()->getWriteablePath() +
            NASENCDATA_XML_FILE_NAME;
        getStaticData().m_sbIsFilePathInitialized = true;
    }   
}

これにより、静的メンバー データにアクセスしようとしたときに、それらが既に初期化されていることが保証されます。これは、すべての静的メンバー データが関数内で静的として定義されているために発生し、それらにアクセスするにはその関数を呼び出す必要があり、コンパイラーはその関数が初めて呼び出されることを確認するコードを生成します (初回のみ)。 ) データは適切に構築および初期化されます。つまり、このデータに実際に初めてアクセスしようとすると、いつでもどこからでも、データが適切に初期化されます。

于 2013-03-11T16:35:20.137 に答える