2012-04-21 8 views
1

ブロックとARCを使用していて、状況によってはリリースビルドでiOSのみがクラッシュすることがあります。このように、コードを書くのは間違った方法でした。リリースビルドでのみiOS 5ブロックがクラッシュする

-(IBAction)clickedButtonA:(UIBarButtonItem*)sender event:(UIEvent*)event { 
    NSMutableArray *arrRows = [NSMutableArray arrayWithCapacity:0]; 
    #warning this code only crash on Release Build.... Don't use this 
    NSMutableDictionary * dicRow = [NSMutableDictionary dictionaryWithCapacity:0]; 
    [arrRows addObject:dicRow]; 
    dispatch_block_t block = ^{ 
    NSString *str = [NSString stringWithFormat:@"%@",[_tweet valueForKey:@"text"]]; 
    [[UIPasteboard generalPasteboard] setString:str]; 
    }; 
    [dicRow setValue:block forKey:kDicKeyLinkPopBlock]; 

    NSMutableArray *sections = [NSMutableArray arrayWithObject:arrRows]; 
    TOVLinkPopoverViewController *controller= [[TOVLinkPopoverViewController alloc] init]; 
    controller.arrayLink = sections; 
} 

他のコントローラからは、ブロックにアクセスすると、リリースビルド時にのみクラッシュします。ブロックをコピーする必要があることを知っています

[dicRow setValue:[block copy] forKey:kDicKeyLinkPopBlock]; 

NSMutableDictionaryのような非ブロック対応クラスの場合。

「リリースビルドではなぜクラッシュするのですか?」という質問があります。私はこれが "クラッシュすべき"であることを知っています。これはブロックを使用する間違った方法でしたが、デバッグビルドでクラッシュしてこの種のバグを早く見つけられることを期待しています。

もう1つの質問は、「このコードをデバッグビルドでクラッシュさせるビルド設定はありますか?」です。

あなたはgithubのからのサンプルコード、 https://github.com/tomohisa/iOS_PopoverMenu_Notification

参照ViewController.mを実行し、コメントアウトコード(リリースにのみクラッシュ)を見つけることができます。

+0

なぜ辞書を容量0に初期化するのですか?それに何かを加えてみてください。 – utahwithak

+0

@cwieldand [NSMutableDictionary dictionaryWithCapacity:0]は[[NSMutableDictionary alloc] init]とちょうど同じですが、これは簡単に入力できるので好きです。それは '変更可能な'ダイスであり、最後に追加することは問題ありません。 –

答えて

6

[block copy]を追加する必要があります。これは、現在のスタックフレーム(つまりclickedButtonA:event:)にブロックが作成されているためですが、そのブロックを辞書に追加して、おそらく後で取り出します。後でそれを取り出して使用すると、その元のスタックフレームがなくなり、実際にはブロックされていない可能性のあるランダムなメモリへのポインタが表示されます。

ブロックをコピーすると、現在スタックにある場合はヒープにコピーされ、ヒープ上にある場合はブロックが保持されます。これは、コンテキスト間で渡すことができ、有効であるブロックを持つことを意味します。

リリースモードでクラッシュするだけの理由は、リリースモードでスタックの処理方法を完全に変更するコンパイラの最適化が有効になるためです。おそらくあなたは問題を見ないようにデバッグモードで非常に運が良かっただけに、あなたのアプリがどのように設計されているかの奇抜なものでした。

関連する問題