夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【BeeCluster】取りあえず完成!しかしiPad6.1シミュレーターでクラッシュ!最適化の副作用か?

4月1日にプロジェクトを開始したBeeCluster。
本日6月18日に完成しました!
3ヶ月で開発するという目標は無事達成しました。
あとはAppleに審査に出してリリースとなりますが、やり方はこれから調べます。

と思ったらiPad 6.1シミュレーターでクラッシュする事が判明。
何かiAdのコードのあたりでトラブってる模様。
エラーメッセージは
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]'
また、iPadシミュレーターだとどのバージョンでも広告が出ません。
まあこれは良いとして、クラッシュはまずいですね。
実機で試せるといいのですが、iPhone4Sしか持ってません。トホホ。

取りあえずOptimization Level をNone [-O0], Faster [-O2], Fastest [-O3]にすればクラッシュしない事が判明。Fast [-O, -O1]かFastest, Smallest [-Os]の時はクラッシュします。

All Exceptionsのブレークポイントを仕掛けて走らせてみると_adview.delegate = self;の行で止まります。

- (id)initLayer
{
    if ((self = [super init])) {
        _bannerIsVisible = NO;
        // iAd設定
        _adView = [[ADBannerView alloc] initWithFrame:CGRectZero];
        _adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifierPortrait;
        [[[CCDirector sharedDirector] view] addSubview:_adView];
        CGSize winSize = [CCDirector sharedDirector].winSize;
        //画面下外側に配置
        _adView.frame = CGRectOffset(_adView.frame, 0, winSize.height);
        _adView.delegate = self; // ここで止まる!
        
        // AdMob設定
        _gadView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner];
        _gadView.adUnitID = @"a15179168f4c6bf";
        _gadView.rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];
        [[[CCDirector sharedDirector] view] addSubview:_gadView];
        _gadView.frame = CGRectOffset(_gadView.frame, 0, winSize.height);
        _gadView.delegate = self;
    }
    return self;
}

結論としては、これ以上この問題については調査せず、リリースビルドで最適化をしない事で回避することにします。
ここ以外にも最適化をする事により何らかの副作用が密かに出ているかもしれません。
この前の__weak変数へのオブジェクト代入ですぐに解放される問題についてもそうですが、わずかな高速化とコードサイズ縮小を得るために動作に何らかの変化が起こる可能性を入れ込むのはリスクが大きいです。

という訳で、クラッシュも無事回避できましたのでApple審査に突撃したいと思います。