Bloki iOS 5 ulegają awarii tylko z Release Build
Używam bloków i ARC, i znalazłem w niektórych sytuacjach, tylko iOS ulega awarii w wersji Release. W ten sposób pisanie kodu było niewłaściwe.
-(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;
}
I od innego kontrolera, kiedy uzyskuję dostęp do bloku, zawiesza się on tylko w wersji kompilacji. Nauczyłem się, że musisz skopiować blok
[dicRow setValue:[block copy] forKey:kDicKeyLinkPopBlock];
Dla świadomych bloków Klasa jak NSMutableDictionary.
Pytanie brzmi: „Dlaczego tylko zawiesza się w wersji Release?” Wiem, że to „powinno się zawiesić”, a to był niewłaściwy sposób użycia bloku, ale mając nadzieję, że zawiedzie na kompilacji Debugowania, możemy znaleźć ten rodzaj błędu wcześniej.
Jeszcze jedno pytanie brzmi: „Czy istnieje jakieś ustawienie kompilacji powodujące awarię tego kodu przy kompilacji debugowania?”
Możesz uruchomić przykładowy kod z gitHub,https://github.com/tomohisa/iOS_PopoverMenu_Notification
Zobacz ViewController.m i znajdź skomentowany kod (zawiesza się tylko przy wydaniu).