Taiatari さんのブログで、
CocosBuilderにリジェクトの罠!このバグ致命的!
同じような問題が、他に投稿されていないかと検索してみたところ、
cocos2d iphone の公式サイトのフォーラムに、
という投稿がありました。
今年、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 修正後
readFloat 修正後- (BOOL) readHeader{// if no bytes loaded, don't crash about it.if( bytes == nil) return NO;// Read magicint magic;unsigned char* pData = ( bytes + currentByte );// int magic = *((int*)(bytes+currentByte));memcpy( &magic, pData, sizeof( int ) );currentByte+=4;if (magic != 'ccbi') return NO;// Read versionint version = [self readIntWithSign:NO];if (version != kCCBVersion){NSLog(@"CCBReader: Incompatible ccbi file version (file: %d reader: %d)",version,kCCBVersion);return NO;}return YES;}
このバグの原因は、armv7のメモリアロケートにあるらしいのですが…- (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;}}}
…よく理解できませんでした。勉強し直します。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。