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.
<code>-(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; } </code>
I od innego kontrolera, kiedy uzyskuję dostęp do bloku, zawiesza się on tylko w wersji kompilacji. Nauczyłem się, że musisz skopiować blok
<code>[dicRow setValue:[block copy] forKey:kDicKeyLinkPopBlock]; </code>
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).