没有调试就不能编码,没有断点(BreakPoint)就不能调试。XCode的断点功能也越来越强大。基本断点如下图所示。这是最常用的断点,也是最容易设置的。左键单击进行设置。编辑断点可以编辑断点。断点有以下属性可以设置:ConditionIgnoreActionOptionsCondition在这里可以输入条件表达式,当条件满足时断点生效。比如上面输入a==50。这是一个非常有用的设置,尤其是在循环体中调试的时候,用起来真的很爽。Ingore可以在这里设置忽略断点的数量。ActionAction是这里最复杂和最大的函数。动作有6种类型。如下图AppleScriptCaptureGPUFrameDebuggerCommandLogMessageShellCommandSound常用的是LogMessage和DebuggerCommandLogMessage,这里填写的可以打印到控制台。比如我做了如下设置:%B会打印断点的名字,%H会打印断点的调用次数,@@中间可以输入表达式。以上设置在控制台的输出如下:#p#DebuggerCommand这里可以输入调试命令,即po(打印对象信息)、bt(打印函数栈)、expression(表达式)这些调试命令.看图就可以理解:图像控制台输出如下:OptionsCheckAutomaticallycontinueafterevaluatedactions断点产生后程序会继续运行。此属性对于在不停止程序的情况下输入调试信息非常有用。除了以上基本断点,XCode还提供了以下四个断点,需要通过点击断点面板左下角的+号来添加。ExceptionBreakpointOpenGLESErrorBreakpointSymbolicBreakpointTestFailureBreakpointExceptionBreakpointExceptionBreakpoint是一个非常有用的断点项。顾名思义,当程序抛出异常时会生成断点。通常程序会崩溃并停在崩溃的地方,但有时也不会恰好停在引起异常的地方。比如数组越界!比如下图,会造成数组越界访问。程序运行时崩溃。但是崩溃停在了main函数,即使你读取了堆栈信息,也不能马上定位到哪个数组被越界访问了。为什么在数组越界的地方不能崩溃?这是因为数组的越界访问并不一定会导致程序崩溃。数组的越界访问会导致抛出异常,抛出的异常得不到处理导致程序崩溃。因此***会导致崩溃停止在CoreFoundation框架中。这时候就需要设置ExceptionBreakpoint,生成断点来定位错误。OpenGLESErrorBreakpoint这个主要是OpenGLES的断点调试,我没用过。SymbolicBreakpointSymbolicBreakpoint,符号断点,真的是调试神器。当程序运行到特定符号时会生成断点。通过这种方式添加断点,不需要在源文件中添加,也不需要知道断点设置在文件的哪一行。如图:比普通断点多了两个属性Symbol和Module。SymbolSymbol的内容可以是:1.方法名:对所有具有该方法名的类方法生效。例如initWithFrame:。2.特定于类的方法:Objective-C和C++类都适用,例如[UIViewinitWithFrame:]或Shap::draw()。3.函数名称。例如普通的C函数。通过将Symbol设置为debug,使用方便,根本停不下来,想怎么断就怎么断。测试失败断点这种类型的断点会在测试断言失败时暂停程序的执行。
