【问题标题】:Objective-C: instance variables out of scope in debuggerObjective-C:调试器中的实例变量超出范围
【发布时间】:2010-12-06 16:04:06
【问题描述】:

我有一个超类和一个子类,它们都定义了实例变量。

超类的大致轮廓:

/* GenericClass.h */
@interface GenericClass : NSObject {
    /* some variables */
}
@end
/* GenericClass.m */
@implementation GenericClass
    /* ... */
@end

子类概要:

/* SpecificClass.h */
#import "GenericClass.h"
@interface SpecificClass : GenericClass {
    NSMutableString *str;
}
/* SpecificClass.m */
#import "SpecificClass.h"
@implementation SpecificClass
- (void)aMethod {
    //Debugger reports str as out of scope
    str = [[NSMutableString alloc] initWithCapacity:100];
    //Works fine:
    self->str = [[NSMutableString alloc] initWithCapacity:100];
    //Doesn't compile as I haven't defined @property/@synthesize:
    self.str = [[NSMutableString alloc] initWithCapacity:100];
}

当我使用直接从 NSObject 继承的类时,不需要 self-> 指针。请注意,在父 GenericClass 中没有定义名称为 str 的对象。 所以,我的问题是,为什么 str 在不被引用为 self->str 时超出范围?代码本身有效,但我无法使用调试器读取变量

【问题讨论】:

    标签: objective-c cocoa inheritance pointers scope


    【解决方案1】:

    GDB 不是一个 Objective-C 编译器。编译器知道诸如 Objective-C 方法中的词法范围之类的东西,但 GDB 不知道。但是,它确实理解局部变量。

    在 Objective-C 中,每个方法在被调用时都有一个隐式的 self 参数传递给它。因此,当您查看 self->str 时,GDB 正在解释它就像解释任何其他局部变量评估一样。

    当您尝试自行评估str 时,GDB 将查找名为str 的局部变量,如果找不到,则报告它不在范围内。这不是错误;这是预期的行为。

    【讨论】:

    • 这很好地说明了 GDB 的工作原理,谢谢!但是有一件事仍然让我感到困惑。我在超类中定义了变量;让我们调用一个 NSMutableString *superstr。在 SpecificClass 的实现中单独引用“superstr”可以正常工作。但是如果不使用 self->,尝试访问在 SpecificClass.h 中定义的变量“str”在调试器中不起作用。 GDB 如何找到一个继承的变量,但没有在这个类自己的头文件中定义?如果我不使用继承,这也可以。这似乎是 XCode 中的一个错误
    • 在调试器控制台窗口 (⇧⌘R) 中尝试 po strpo superstr。如果它们给出相同的结果,则问题与 Xcode 无关(这很可能)。
    • 奇怪的是,po str 和 po superstr 在控制台中工作正常,po self->str 和 po self->superstr 也是如此。只有在可视化调试 UI 中,没有 self-> 的 str 变量在用鼠标移动时报告超出范围,但代码中的读/写操作工作得很好。我会将其记录为 Apple 的错误。同时,我在任何地方都使用 self->(尽管我不想这样做),以便进行可视化调试。
    猜你喜欢
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2011-11-15
    • 2016-04-30
    • 1970-01-01
    相关资源
    最近更新 更多