ブロックと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に初期化するのですか?それに何かを加えてみてください。 – utahwithak
@cwieldand [NSMutableDictionary dictionaryWithCapacity:0]は[[NSMutableDictionary alloc] init]とちょうど同じですが、これは簡単に入力できるので好きです。それは '変更可能な'ダイスであり、最後に追加することは問題ありません。 –