【发布时间】:2009-07-06 18:37:32
【问题描述】:
当按下键盘上的返回按钮时调用一个方法。在调用另一个返回整数的方法后,会根据该整数创建一条消息。然后将消息传递到 UIAlterView 并显示给用户。警报没有任何选项(因此我不调用委托),只是简单地通知用户发生了什么。
编辑:下面是完整的方法(之前显示的部分)。当我注释掉 UIAlertView 之前的所有内容并替换字符串 @"test" 而不是传递消息时,警报会成功显示。我的结构没有正确处理内存吗?
- (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];分配了字符串。
【问题讨论】:
-
如果将 message:message 替换为 message:@"test" 是否有效?
-
没有。同样的错误。我什至注释掉了条件消息创建块。
-
很奇怪。您是否尝试过单步调试器以找出错误发生在哪一行?我只是好奇我们是不是找错地方了。
-
它出现在方法的最后。你似乎是对的,Ken,这是该方法的早期内容(请参阅最新编辑)。
-
尝试在方法的顶部添加断点。然后使用 step into 选项单步执行每一行。您已将其范围缩小到 UIAlertView 行以上,但仍然很难看出问题所在。当出现 EXC-BAD-ACCESS 消息时,无论调试器停留在哪一行,这都是您的问题行。有关调试基础知识的精彩视频,请参阅 Jeff LaMarche 关于调试的博客文章:iphonedevelopment.blogspot.com/2009/03/debugging.html
标签: iphone memory-management uialertview exc-bad-access