我在我的应用中遇到了EXC_BAD_ACCESS错误。或者在我的一个班级中更具体。它是Custom UIAlertView类。当它在使用中抛出EXC_BAD_ACCESS时我无法捕获。有时候它会像预期的那样运作得很好,并且在所有的suden中它都有它......这是全班
@implementation AlertPassword
int counter = 3;
@synthesize done;
@synthesize alertText;
@synthesize msg;
- (void) showAlert :(NSString*) title
{
if(counter != 3){
if(counter == 1)
{
NSString *msgs = @"Last warning";
msg = msgs;
}
else
{
NSString *msgs = [NSString stringWithFormat:@"WRONG PIN. %d times remaining",counter];
msg = msgs;
}
}
else
{
NSString *msgs = @"Enter your pin";
msg = msgs;
}
UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Security" message:msg delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles: nil];
_alert = alert;
_alert.alertViewStyle = UIAlertViewStyleSecureTextInput;
alertText = [_alert textFieldAtIndex:0];
alertText.keyboardType = UIKeyboardTypeNumberPad;
alertText.placeholder = @"Pin";
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(controlTextDidChange:)
name:UITextFieldTextDidChangeNotification object:alertText];
[_alert show];
[_alert release];
[[NSNotificationCenter defaultCenter] removeObserver:UITextFieldTextDidChangeNotification];
}
- (void)controlTextDidChange:(NSNotification *)notification {
{
NSString *pin = [[NSUserDefaults standardUserDefaults] stringForKey:@"Pin"];
if ([notification object] == alertText)
{
if (alertText.text.length == pin.length)
{
if(counter != 0)
{
if([alertText.text isEqualToString:pin])
{
[_alert dismissWithClickedButtonIndex:0 animated:NO];
[self.tableViewController openSettings];
counter = 3;
}
else
{
counter--;
[_alert dismissWithClickedButtonIndex:0 animated:NO];
[self showAlert:@""];
}
}
else
{
[_alert dismissWithClickedButtonIndex:0 animated:NO];
[[NSUserDefaults standardUserDefaults] setObject:NULL
forKey:@"Telephone"];
[[NSUserDefaults standardUserDefaults] setObject:NULL
forKey:@"Pin"];
[[NSUserDefaults standardUserDefaults] synchronize];
UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"" message:AMLocalizedString(@"EraseData", nil) delegate:nil cancelButtonTitle:AMLocalizedString(@"Ok", nil) otherButtonTitles:nil];
counter = 3;
[av show];
[av release];
}
}
}
}
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
NSString *pincheck = [[NSUserDefaults standardUserDefaults] stringForKey:@"pinCheck"];
if (buttonIndex == 0)
{
if(pincheck.intValue == 1)
{
NSLog(@"app kill");
exit(0);
}
else
{
NSLog(@"dismiss");
}
}
}
@end
这是我初始化和使用这个类的地方。
case 5:
NSLog(@"Add remove");
if (pincheck != NULL && pin != NULL){
if([pincheck isEqualToString:@"0"])
{
AlertPassword *alert = [AlertPassword alloc];
alert.tableViewController = self;
NSString *msg = @"Enter your pin code to access:";
[alert showAlert:msg];
// [alert release];
}
break;
}
else
{
NSLog(@"Is null");
[Menu load2View:self];
}
break;
我可能是因为我没有发布警报。但是在用户尝试输入内容之后添加[alert release];
Made直接拥有EXC_BAD_ACCESS。如果没有[alert release];
则可行。但有时它会与EXC_BAD_ACCESS
有时也会得到
2012-11-08 12:11:27.451 kodinisRaktas[2485:19d03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSMallocBlock__ dismissWithClickedButtonIndex:animated:]: unrecognized selector sent to instance 0x947aae0'
但我也不知道为什么会发生这种情况
请帮助,我对objective-c和ios很新,我不知道如何摆脱这个,我想有经验的人会在我的代码中看到错误。
我刚刚看到,如果您将取消推送4-5次或更多次,则会抛出EXC_BAD_ACCESS或无法识别的选择器,然后尝试输入内容。
答案 0 :(得分:1)
EXC_BAD_ACCESS主要是由于内存处理不当造成的。警报很可能成为一个僵尸...我会将警报作为一个强大/保留的财产。你应该在显示时坚持下去。在“show”之后不会发布。
当您设置第一个时,您可以这样做
_alert = [[UIAlertView alloc] initWithTitle:@"Security" message:msg delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles: nil]; // retain count: 1
注意调用“show”也会保留它,但这并不会改变你需要的事实。
[_alert show]; // retain count: 2
等待委托回调并释放它。
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
[_alert release], _alert = nil; // retain count in next run will be 0
}
提示:如果将UIAlertView与块结合使用,可能会更容易处理。 http://gkoreman.com/blog/2011/02/15/uialertview-with-blocks/
答案 1 :(得分:0)
我没有看到你在哪里初始化警报,无论如何我认为它是一个类字段,所以保留它。如果它不是一个类实例变量,那就这样,这样你就会有一个指向它的指针。
[__NSMallocBlock__ dismissWithClickedButtonIndex:animated:]
您正在将此消息发送到原始malloc块,因此可能已发布警报并指向用于其他内容的内存,这不是objc对象。
尽量保持警惕,看看会发生什么。
答案 2 :(得分:0)
可能是您将错误的值传递给此“dismissWithClickedButtonIndex:animated:”方法,该方法无法识别值签名,请对其进行双重检查;
答案 3 :(得分:0)
例外答案确实有意义,可能是原因
但是这是什么? [NSNotificationCenter defaultCenter] removeObserver:UITextFieldTextDidChangeNotification];