Strange UIAlertView private _performPopup method failed

I am trying to calculate the failure caused by a private method in UIAlertView. About half of my application crashes are related to this.

-[UIAlertView(Private) _performPopup:animationType:revealedBySpringBoardAlert:] 

Here is a section from my crash report. What bothers me is that most of my warnings are displayed as single-user objects that are designed to exist throughout the entire application life cycle. So I'm not sure if this is because the UIAlertView delegate will be released before it is called by it. Has anyone seen this before? Could you advise? Thanks.

 Hardware Model: iPhone4,1 Version: ??? (???) Code Type: ARM (Native) Parent Process: launchd [1] Date/Time: 2012-11-15 11:31:57.452 -0800 OS Version: iOS 6.0.1 (10A523) Report Version: 104 Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Codes: KERN_INVALID_ADDRESS at 0x5354440a Crashed Thread: 0 Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 0 libobjc.A.dylib 0x33ab95b6 objc_msgSend + 22 1 UIKit 0x32e52fa0 -[UIAlertView(Private) _performPopup:animationType:revealedBySpringBoardAlert:] 2 UIKit 0x330621c4 -[UIAlertView(Private) _repopupNoAnimation] 3 UIKit 0x33065b38 __36-[_UIAlertStackWatcher _appResumed:]_block_invoke_0 4 libdispatch.dylib 0x37ec211c _dispatch_call_block_and_release 5 libdispatch.dylib 0x37ec14b4 _dispatch_client_callout 6 libdispatch.dylib 0x37ec61b8 _dispatch_main_queue_callback_4CF$VARIANT$mp 7 CoreFoundation 0x39ba2f36 __CFRunLoopRun 8 CoreFoundation 0x39b15eb8 CFRunLoopRunSpecific 9 CoreFoundation 0x39b15d44 CFRunLoopRunInMode 10 GraphicsServices 0x37ee32e6 GSEventRunModal 11 UIKit 0x32d552f4 UIApplicationMain 12 MYAPP 0x0000334a main + 70 13 MYAPP 0x000032fc start + 36 
+8
ios iphone xcode crash-reports uialertview
source share
2 answers

It seems that the delegate is causing this problem. For simple UIAlertViews that do not require tracking user input, you can simply set the delegate to zero, for example:

 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"My Alert" message: @"My Message" delegate: nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; 

If you need delegate methods, just make sure you lose the UIAlertView delegate by losing view:

 alert.delegate = nil; 

Either in dealloc, or perhaps in viewWillDisappear: depending on how your code is configured!

+3
source share

It was also nice to fire and turn off the alert when the app goes to the background.

Add the following to the viewDidLoad method:

  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleApplicationDidEnterBackground:) name:UIApplicationDidEnterBackgroundNotification object:nil]; 

The implementation of handleApplicationDidEnterBackground should then look like this:

 - (void)handleApplicationDidEnterBackground:(NSNotification *)n { if (self.alertView) { self.alertView.delegate = nil; [self.alertView dismissWithClickedButtonIndex:[self.alertView cancelButtonIndex] animated:NO]; self.alertView = nil; } } 
0
source share

All Articles