Objective c iOS 7错误或UIAlertView中的我的错误
当我的应用程序在UIAlertView上点击“OK”时崩溃,我得到了以下堆栈跟踪。是我的错还是iOS7的错误?我不知道怎么解决这个问题Objective c iOS 7错误或UIAlertView中的我的错误,objective-c,ios7,uialertview,Objective C,Ios7,Uialertview,当我的应用程序在UIAlertView上点击“OK”时崩溃,我得到了以下堆栈跟踪。是我的错还是iOS7的错误?我不知道怎么解决这个问题 OS Version: iOS 7.0 (11A465) Report Version: 104 Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Subtype: KERN_INVALID_ADDRESS at 0x00000000 Triggered by Thread:
OS Version: iOS 7.0 (11A465)
Report Version: 104
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x00000000
Triggered by Thread: 0
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x39d50b36 objc_msgSend + 22
1 UIKit 0x3212e3da -[UIAlertView(Private) modalItem:shouldDismissForButtonAtIndex:] + 58
2 UIKit 0x31ed2036 -[_UIModalItemsCoordinator _notifyDelegateModalItem:tappedButtonAtIndex:] + 90
3 UIKit 0x31ed1f3e -[_UIModalItemAlertContentView tableView:didSelectRowAtIndexPath:] + 890
4 UIKit 0x31dd7326 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1074
5 UIKit 0x31e8a24e -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 210
6 UIKit 0x31d3a96e _applyBlockToCFArrayCopiedToStack + 314
7 UIKit 0x31cb246e _afterCACommitHandler + 426
8 CoreFoundation 0x2f5141d2 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 18
9 CoreFoundation 0x2f511b74 __CFRunLoopDoObservers + 280
10 CoreFoundation 0x2f511eb6 __CFRunLoopRun + 726
11 CoreFoundation 0x2f47cce2 CFRunLoopRunSpecific + 518
12 CoreFoundation 0x2f47cac6 CFRunLoopRunInMode + 102
13 GraphicsServices 0x3417727e GSEventRunModal + 134
14 UIKit 0x31d1ea3c UIApplicationMain + 1132
15 MyApp 0x000d8e5e 0xcb000 + 56926
16 libdyld.dylib 0x3a25dab4 start + 0
警报视图代码
UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Error"
message:[NSString stringWithFormat:@"Es ist ein Fehler aufgetreten: %@", [error localizedDescription]]
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[av show];
我还没有定义委托方法。愚蠢的我,我只需要将警报视图的委托设置为nil,因为
UIAlertView
的委托是UIAlertView
中的一个assign属性。我认为这是苹果的错。它应该是圆弧中的弱指针。但它是一个assign属性,因此在销毁委托之前(大多数情况下,控制器类被弹出或导航回),需要将任何警报视图的委托设置为nil
。阅读有关委托的UIAlertView
的.h文件,您会发现它是一个assign属性,有人在声明后评论说“//weak reference”。在使用委托时避免UIAlertView出现问题的最佳方法是
将UIAlertView的实例作为委托类的iVar。在delegate类的dealloc中将alertView的delegate属性设置为nil之后
@implementation YOUR_CLASS
{
UIAlertView *_alert;
}
- (void)dealloc
{
_alert.delegate = nil;
}
- (void)showAlertView
{
_alert = [[UIAlertView alloc] initWithTitle:title message:message delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
对于所有具有assign type委托的旧类,同样的方法已经足够好了。如果需要指定委托,在警报视图上执行“自动释放”也可以。能否显示用于显示警报视图的代码以及您编写的委托方法。谢谢。正如@Fogmeister所说,你能提供你的警报代码和它的代表代码吗?谢谢没错,我只是写了一篇评论!)但是,我仍然认为即使将委托设置为self,它也不应该崩溃。如果UIAlertView的协议被正确实现,它也应该在委托设置为self的情况下工作。我错了吗?这是否意味着发生在您身上只是因为您设置了委托,但没有处理它的委托方法?我无法重现这种行为-我的应用程序当时没有崩溃,但我在CrashLytics中有相同的崩溃日志…@swalkner是的,它确实发生了这正是发生的事情:代理在警报视图显示后立即被销毁。我遇到了同样的问题,但只有我们创建一个ipa并运行它时才会发生。不在模拟器或调试中为什么?有什么想法吗?