【问题标题】:How can I step though [messages] in XCode/Objective-C for iOS apps?如何在 XCode/Objective-C for iOS 应用程序中单步执行 [messages]?
【发布时间】:2011-08-03 01:28:34
【问题描述】:

更新:似乎有一个返回双精度/浮点数的方法并尝试进入的问题。由于我能够进入setOperand 但不能进入preformOperation,因此我尝试将preformOperation- (void) 更改为- (void),一切都按预期工作。玩得更多,我尝试了(int)(float)(id)

(int)(id) 都允许我毫无问题地进入该方法。 (float) 但是表现出与 (double) 相同的行为,其中 xcode 只会越过这条线,而不是让我跨入。

有人对为什么会发生这种情况有任何想法吗?

原文: 我最近决定学习 Obj-C/iOS 编程,但在尝试单步执行代码时有点卡住了。

如果我脑子里有以下方法:

//CalcBrain.h
@interface CalcBrain : NSObject {
double operand;
NSString * waitingOperation;
double waitingOperand;
}
- (void)setOperand:(double)anOperand;
- (double)performOperation:(NSString *)operation;
@end

在视图控制器中:

//CalcViewControl.m
...
- (CalcBrain *)brain
{    
    if(!brain)
        brain = [[CalcBrain alloc] init];
    return brain;
}
...   
- (IBAction)operationPressed:(UIButton *)sender
{
    if(inMiddleOfOps)
    {
            [[self brain] setOperand:[[display text] doubleValue]];
            inMiddleOfOps = NO;
    }
    NSString *operation = [[sender titleLabel] text];
    double result = [[self brain] performOperation:operation];

   [display setText:[NSString stringWithFormat:@"%g", result]];
}
...

如果我在以下位置设置断点: double result = [[self brain] performOperation:operation];

然后“步入”,我将看到它进入 CalcViewControll.m 中的 [self brain] 代码部分,但是一旦我从该部分返回,它就会直接进入下一行。来自 C/C++ 背景,这不是我所期望的行为,而是我在想/希望它会进入 CalcBrain.m 并让我逐步完成 performOperation“大脑”内部的方法。

如果我在 performOperation 方法的第一行添加断点,我可以获得此功能 - 但这并不理想。

我知道这些是正在发送的消息,但你真的不能走进去看看发生了什么吗?我错过了一些明显的东西吗?如果它有所作为,我正在使用 Xcode 3.2.6。

编辑:

[自脑]不为零。

我正在调试配置中运行/构建(未设置优化)。

我已尝试将有问题的行分成两条单独的行,但仍无法按预期工作。

【问题讨论】:

    标签: objective-c xcode debugging


    【解决方案1】:

    当它仍在该行时,您应该能够再次点击“step into”。它应该按照您期望的方式工作 - 当一行上有多个嵌套调用时(如您的示例 - 访问器是一种方法,-performOperation: 是另一种方法),“步入”行为将进入它们按照他们的执行顺序。他们会回来,然后进入下一个。

    当您从 -brain 访问器返回时,您确定没有点击“Step over”吗?

    如果它确实不能正常工作,也许您正在调试发布版本或其他一些经过显着优化的二进制文件,并且您看到调试器在源代码步进时遇到的正常混乱?

    【讨论】:

    • 100% 确定我一直在捣碎“步入”。我什至可以输入[self brain],执行“Step out”。返回到double result = [[self brain] performOperation:operation];,然后点击“Step into”就到了下一行,貌似忽略了-performOperation
    • @Zack:真不知道该告诉你什么,除了 GUI 调试器通常表现不佳。它应该做你想做的事。您是否能够将两个方法调用分开到不同的行并获得您想要的介入? (我只是好奇,我知道这并不能解决问题。)
    • 我试着把它分成两行。当我到达double result = [brain performOperation:operation]; 时,它会直接越过它(不过,结果会更新为正确的值)。有趣的是,即使我使用内置的 gdb 控制台并只是“步进”,它仍然会直接跳过那段代码。
    • 我正在调试构建 - 并且 -O0 已定义。
    【解决方案2】:

    [self brain] 并非偶然返回 nil。

    【讨论】:

    • 不是。三重检查。我已经用更多代码更新了我的帖子,以确保大脑不能为零。
    • CalcBrain init 方法仍然可以返回 nil(表示失败)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多