ブロックと ARC を使用していますが、状況によっては、iOS がリリース ビルドでのみクラッシュすることがわかりました。このようなコードの書き方は間違っていました。
-(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 を参照して、コメント アウトされたコードを見つけます (リリース時にのみクラッシュします)。