iPhone应用程序崩溃,没有任何控制台错误或崩溃日志:

5
我是新手。我正在尝试构建一个问答应用程序,虽然我的应用程序在第一次运行时正常运行,但在第二次运行时退出且没有任何控制台错误。以下是所有代码的引用。
似乎当我重新运行问答时,下面的-(void) loadNextWord函数确实执行了,但之后什么也没有发生。
请帮忙!
谢谢!
调试器中的转储:
我的主函数中第14行是int retVal = UIApplicationMain(argc, argv, nil, nil);
#import <UIKit/UIKit.h>

 int main(int argc, char *argv[]) {

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}

Program received signal:  “EXC_BAD_ACCESS”.
(gdb)
#0  0x025f0907 in objc_msgSend ()
#1  0x05f28da0 in ?? ()
#2  0x023cfc9d in _CFAutoreleasePoolPop ()
#3  0x0001ee67 in -[NSAutoreleasePool release] ()
#4  0x002cfe7f in _UIApplicationHandleEvent ()
#5  0x02d73822 in PurpleEventCallback ()
#6  0x02474ff4 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#7  0x023d5807 in __CFRunLoopDoSource1 ()
#8  0x023d2a93 in __CFRunLoopRun ()
#9  0x023d2350 in CFRunLoopRunSpecific ()
#10 0x023d2271 in CFRunLoopRunInMode ()
#11 0x02d7200c in GSEventRunModal ()
#12 0x02d720d1 in GSEventRun ()
#13 0x002d3af2 in UIApplicationMain ()
#14 0x00002880 in main (argc=1, argv=0xbfffef94) at /Users/vbhardwaj/Documents/ObjectiveC/FinalProject/FunWords/main.m:14

2
看起来你可能拼错了 dealloc... - Jacob Relkin
嗨,Jacob - 这个问题已经在代码中修复了,只是在格式化时拼写错误了。这似乎不是问题的原因... - Vatsal Bhardwaj
你是否尝试以 Debug 模式运行?选择 Debug 配置并启动带有调试器的附加程序。控制台应该在正确的行上立即停止或给出一个良好的提示。 - Eiko
谢谢Eiko!我刚刚插入了来自调试器的转储。它指向main.m文件(这个项目中我甚至没有触及过)。它抱怨的那一行是int retVal = UIApplicationMain(argc, argv, nil, nil); - Vatsal Bhardwaj
2个回答

8

查看堆栈跟踪,您会看到这一行

[NSAutoreleasePool release]

这告诉我你释放了一个对象太多次,例如:
NSString *string = [NSString stringWithString:@"Hello"]; // This string is autoreleased
[string release]; // This line won't crash but is WRONG!

以上代码不会立即崩溃,但字符串将被释放和dealloc'd。然而,因为它也是自动释放的,自动释放池将在未来的某个时刻尝试再次释放它。你不知道何时会发生,并且会得到一个随机崩溃。

你可能已经做过类似的事情 :)


谢谢Dean!那确实是问题所在。我将本地/临时变量的内存管理更改为初始化时自动释放(而不是尝试自己释放),似乎已经解决了问题。 - Vatsal Bhardwaj
啊...突然有这么多崩溃报告就有意义了。我太菜了 :) - Stian Høiland

0

问题出在多版本发布上。

为了能够正确地调试您的代码,甚至包括文件也是必要的。 我可以看到您在代码中释放了wordImageView。 您不应该这样做。 您应该利用属性,像以下方式进行操作:

self.wordImageView = nextImageView;
[nextImageView release];

而不是

[wordImageView release]; // release the flagView's memory
wordImageView = nextImageView; // reassign flagView to the new view

你也可以使用自动释放池,但这会带来内存损耗的问题。

顺便说一句,虽然问题似乎出现在主循环中,但实际上并不是。那只是自动释放池被清除的位置,而问题则出现在其他地方。

无论如何,建议检查代码,并确保所有的 'alloc' 都由同一个选择器中相同的对象的 'release' 处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接