rte*_*emp 10 iphone xcode xcodebuild
我是Microsoft的长期开发人员,我是使用XCode进行iPhone开发的新手.所以,我正在读一本书,并通过示例尝试自学如何使用Objective-C编写iPhone应用程序.到目前为止一切都很顺利,但偶尔我会objc_exception_throw在运行时遇到通用的' '消息.发生这种情况时,很难找到此异常的来源.经过一些反复试验,我找到了答案.其中一个参数拼写错误.
正如你在下面看到的那样,我错过了'otherButtonTitles'参数,省略了第二个't'按钮.
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Date and Time Selected"
message:message
delegate:nil
cancelButtonTitle:@"Cancel"
otherButonTitles:nil];
Run Code Online (Sandbox Code Playgroud)
这花费我时间的原因是代码构建成功.这是Objective-C编译器的正常行为吗?当我像这样做一个常见的语法错误时,我习惯于在.NET编译器中使构建失败.是否有编译器设置我可以更改以在构建这些错误时使构建失败?
lhu*_*ath 25
首先,打开~/.gdbinit(这是.gdbinit在您的主目录中调用的文件- 是的,以点开头)并将其放入其中:
fb -[NSException raise]
fb objc_exception_throw
fb malloc_error_break
Run Code Online (Sandbox Code Playgroud)
这将使用三个默认断点初始化GDB,当它们发生时,GDB将暂停您的应用程序并向您显示堆栈跟踪.这与Xcode非常好地集成,因此只要在某处发生异常或malloc失败,您就可以通过单击堆栈跟踪元素来很好地遍历代码.
然后,打开Get Info项目中的面板(或选择项目(顶部项目Groups & Files)并点击cmd-i),转到Build选项卡并将项目设置Base SDK为Device - iPhone OS [someversion].一直滚动到底部并找到该GCC 4.0 - Warnings部分.那里; 打开尽可能多的警告,但要确保打开Treat Warnings as Errors(这相当于GCC_TREAT_WARNINGS_AS_ERRORS).我个人认为:
GCC警告构建设置http://lhunath.lyndir.com/stuff/gcc_warnings.png
您现在应该在代码中遇到大多数错误的编译器警告,并且在您修复代码之前编译器不会让您运行代码.当事情确实越过编译器的鼻子时,你应该能够轻松找到问题,GDB在一个方便的位置破解.
你也应该研究一下NSZombie*.这些是环境变量,非常便于早期破坏不良内存分配或访问情况.例如; 王氏NSZombieEnabled什么都不会真正被释放; 在dealloc上它会被覆盖,_NSZombie如果你再次尝试访问这个解除分配的内存(取消引用一个解除分配的指针),你将在GDB中获得一些东西,而不是正常的调用,只是在随机数据上发出(当然,这不是你想要的).有关详细信息,请参阅http://www.cocoadev.com/index.pl?NSZombieEnabled.
始终使用-WerrorGCC设置(GCC_TREAT_WARNINGS_AS_ERRORS = YES).您的代码中永远不应该出现警告,这是警告是严重错误的示例.
此外,如果你得到一个objc_exception_throw,切换到控制台(Command-shift-R)并寻找第一个"低"号码地址.
2009-04-01 13:25:43.385 CrashExample[41720:20b] Stack: (
2528013804,
2478503148,
2528036920,
2528053460,
2358032430,
11076,
11880,
816174880,
345098340,
145973440,
816174880,
)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它将是"11076".所以输入控制台:
info line *11076
Run Code Online (Sandbox Code Playgroud)
这将告诉您代码中抛出异常的行.
拼写错误的参数通常应该导致"警告:这样的对象不响应选择器x"在所讨论的行中为黄色.我相信默认情况下这是打开的,因为我没有必要更改任何编译器设置来查看这些.
此外,当我遇到未捕获的异常时,放入gdb控制台(应该在执行应用程序时出现)并输入以下内容以获取所有线程的回溯有时是有益的:
taa bt
| 归档时间: |
|
| 查看次数: |
5786 次 |
| 最近记录: |