UIAlertView中无法显示在“EXC_BAD_ACCESS”错误结果(UIAlertView

2019-06-25 09:12发布

当按下键盘上的返回按钮的方法被调用。 调用返回基于该整数被创建的消息的整数的另一种方法之后。 然后,该消息被传递到一个UIAlterView并显示给用户。 警报没有任何选项(因此为什么我不打电话委托),但只是通知所发生的用户。

编辑:以下是完整方法(先前显示的部分)。 当我注释掉之前一切UIAlertView并替换字符串@“测试”,而不是传递消息的警报被成功所示。 我不能用我的结构,正确处理内存?

- (IBAction)joinButton {
    struct userInfo localUser;

    [emailAddress resignFirstResponder];

    //convert textField text to char array in structure
    localUser.firstName = [self convertStringtoCharArray:firstName.text];
    localUser.lastName = [self convertStringtoCharArray:lastName.text];
    localUser.username = [self convertStringtoCharArray:username.text];
    localUser.email = [self convertStringtoCharArray:emailAddress.text];
    localUser.ipAddress = [self convertStringtoCharArray:localIPAddress.text];
    localUser.latitude = currentLocation.coordinate.latitude;
    localUser.longitude = currentLocation.coordinate.longitude;

    //pass structure to be sent over socket
    int result = [myNetworkConnection registerWithServer:&localUser];

    NSString *message = nil;

    //process result of sending attempt
    if (result == 0) {
        //registration succesful
        message = [NSString stringWithString:@"Registration successful"];
    } else if (result == 1) {
        //server unavailable
        message = [NSString stringWithString:@"Server unavailable. Please check your wi-fi settings and try again."];
    } else if (result == 2) {
        //unable to establish connection
        message = [NSString stringWithString:@"Unable to communicate with server. Please check your wi-fi settings and try again."];
    } else if (result == 3) {
        //username already in use
        message = [NSString stringWithString:@"Username in use. Try another username."];
    }

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Registration"
                                                    message:message
                                                   delegate:nil 
                                          cancelButtonTitle:@"Ok" 
                                          otherButtonTitles:nil];

    [alert show];
    [alert release];
}

当我执行的代码iPhone格雷斯出像它即将显示一个警告,但崩溃。 我得到一个EXC_BAD_ACCESS错误在控制台中。 我不能释放任何警报或正确的信息? 这里是控制台输出:

Program received signal:  “EXC_BAD_ACCESS”.
(gdb) backtrace
#0  0x30011944 in objc_msgSend ()
#1  0x3054803e in NSPopAutoreleasePool ()
#2  0x3054c808 in -[NSAutoreleasePool release] ()
#3  0x30936ac4 in _UIApplicationHandleEvent ()
#4  0x3204696c in PurpleEventCallback ()
#5  0x30254a76 in CFRunLoopRunSpecific ()
#6  0x3025416a in CFRunLoopRunInMode ()
#7  0x320452a4 in GSEventRunModal ()
#8  0x308f037c in -[UIApplication _run] ()
#9  0x308eea94 in UIApplicationMain ()
#10 0x000020bc in main (argc=1, argv=0x2ffff508) at /Users/reu2009/Documents/iPhone Development/Development/BuddyTracker/main.m:14
(gdb) frame 10
#10 0x000020bc in main (argc=1, argv=0x2ffff508) at /Users/reu2009/Documents/iPhone Development/Development/BuddyTracker/main.m:14 14       int retVal = UIApplicationMain(argc, argv, nil, nil);

编辑:删除[message release]; 和使用分配的字符串[NSString stringWithString]; 基于答案。

Answer 1:

我有一个问题是这样的...我是从后台线程调用UIAlertView中....从主线程中调用它



Answer 2:

从方便构造函数返回的对象已经被设置为自动释放。 当你宣布一个指向“信息”,“消息”对象本身不属于你的,因为你使用了@“字符串”方便构造函数来创建NSString的对象。 因此,你不需要将其释放。

当你手动释放它,它就会得到释放过多次(手动,一旦当自动释放过程来临时),并引发错误。

下面是来自苹果的一些附加信息:

http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html

拇指好的规则:除非您使用页头或init的一个或复制方法来创建一个对象(或者,如果你保留自己的对象),你不需要释放它,但是可以依赖于实际创建它的方法做到这一点为你工作。



Answer 3:

与NSZombieEnabled试试吧= YES。

  • 走进你的可执行信息。
  • 单击参数选项卡。
  • 点击+的“变量在环境中进行设置。”
  • 键入NSZombieEnable和YES。

当内存被释放一个已经被释放,NSZombie会显示地址,然后就可以用仪器来找到实际的对象。 科尔宾的树有如何做到这一点很好的概述: 在Leopard仪器:如何调试那些随机崩溃您的Cocoa程序



Answer 4:

肖恩是正确的 - 你不需要调用[信息发布]在这里,因为你从来没有真正保留的消息对象。

而不是只是说message = @"string" ,你需要说message = [NSString stringWithString:@"string"]; 要完全诚实的,我不知道为什么(也许有人可以发表意见,我可以改善这个职位!),但应该做的伎俩。



Answer 5:

我这里有一个UIAlertView中有同样的问题,在我的情况,我有另外一个类实现了警报,并从另外一个我打电话的静态方法。 像下面这样:

ClassA

...

doSomething {
 ... some stuff ...

 [MyAlertView showAlert];

 ... some other stuff...

}

我怀疑的是,随着alertview异步所示,当我点击按钮的对象已经被释放。

为了验证这一点,我改变了代码实例警报,而不是将其释放。 和everythong工作。

我的最终的解决办法是在声明父视图的变量,以及与其它变量释放它当视图被释放。



Answer 6:

这可能例因从后台线程更新的UIKit

我解决它像这样

UIAlertView *alertMSG = [[UIAlertView alloc] initWithTitle:nil
                        message:@"Your mnessage here"
                        delegate:self
                        cancelButtonTitle:@"Title here"
                        otherButtonTitles: nil];

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
         [alertMSG show];
    }];


文章来源: UIAlertView fails to show and results in “EXC_BAD_ACCESS” error