何気なくCocosBuilderで検索していたところ、下記のようなブログの投稿を発見しました。
Taiatari さんのブログで、
CocosBuilderにリジェクトの罠!このバグ致命的!
同じような問題が、他に投稿されていないかと検索してみたところ、
cocos2d iphone の公式サイトのフォーラムに、
iPad project using CocosBuilder fails release, runs debug
という投稿がありました。
今年、2013年の5月に投稿されていたようで、今頃になって見つけてしまいました。
私も、CocosBuilderの2.1でアプリを制作していまして申請直前でしたので、助かりました。
これからは、こまめにチェックしておかないといけないですね。
どうも、ありがとうございます。
自分のアプリをReleaseで実機 iPodTouch 4th iOS6.1.5 で実行させたところ。
見事にクラッシュしました。
Organizerのデバイスログで見ると、
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 hoge-iOS 0x000d74b8 -[CCBReader readFloat] (CCBReader.m:199)
やはり、CCBReader.m のメソッド readFloat で落ちているみたいです。
上記の公式サイトの投稿によると readHeader も修正したほうがよさそうです。
readHeader 修正後
- (BOOL) readHeader
{
// if no bytes loaded, don't crash about it.
if( bytes == nil) return NO;
// Read magic
int magic;
unsigned char* pData = ( bytes + currentByte );
// int magic = *((int*)(bytes+currentByte));
memcpy( &magic, pData, sizeof( int ) );
currentByte+=4;
if (magic != 'ccbi') return NO;
// Read version
int version = [self readIntWithSign:NO];
if (version != kCCBVersion)
{
NSLog(@"CCBReader: Incompatible ccbi file version (file: %d reader: %d)",version,kCCBVersion);
return NO;
}
return YES;
}
readFloat 修正後
- (float) readFloat
{
unsigned char type = [self readByte];
switch (type) {
case kCCBFloat0:
return 0;
case kCCBFloat1:
return 1;
case kCCBFloatMinus1:
return -1;
case kCCBFloat05:
return 0.5f;
case kCCBFloatInteger:
return [self readIntWithSign:YES];
default: {
// using a memcpy since the compiler isn't
// doing the float ptr math correctly on device.
float f = 0;
unsigned char* pData = (bytes + currentByte);
memcpy(&f, pData, sizeof(float));
currentByte+=4;
return f;
}
}
}
このバグの原因は、armv7のメモリアロケートにあるらしいのですが…
…よく理解できませんでした。勉強し直します。