2011-05-30 32 views
8

在Xcode中调试objc时检查 '超级',GDB给出如下:如何在gdb

> po self 
<SomeClassName: 0x6672e50> 

到目前为止好......但是:

> po super 
No symbol "super" in current context. 

在利益清晰度,我真正想要做的是在调试时发送消息给super。例如,我想要做这样的事情:

> po [super doSomething] 

但是我怎么引用super从gdb的环境中?谢谢!

回答

4

嘿,我们是just talking about this!super这个词除了作为消息的接收者,即[super doSomething]没有任何作用。它只是向编译器提示它应该在超类中搜索方法的实现,而不是当前的类对象。

如果您想要一个对象的实际超类对象,请使用NSObject协议的superclass method[self superclass]


我不知道如何去做你想要的东西。调试器钩子怎么样?把它写进你的班级:

- (void) callSupersDoSomething { 
    [super doSomething]; 
} 

然后你可以从调试器中调用[self callSupersDoSomething]

+1

不会返回一个Class对象而不是一个超级引用吗?所以在我上面的例子中,在gdb:'po [self superclass]中返回:'SomeClassName',而不是必需的:'' – Jim 2011-05-30 00:34:02

+1

@Jim:没有“超级引用”之类的东西。在'self'中有一个对当前对象的引用,你可以用'[self superclass]'获得对超类的引用,但是在你的程序中没有实际的东西叫做“super”。这是一个使消息被发送到'self'的关键字,但是在解析消息时会跳过当前类的方法。 – Chuck 2011-05-30 00:53:10

+0

Chuck的评论比我的更清楚,但@Jim,你在寻找超类时有什么想法? – 2011-05-30 01:13:15

4

这里要记住的是,这是super == self。它是同一个对象指针,但super关键字告诉消息分派代码开始寻找类层次结构中一个级别的实现。

+0

很好,我想弄清楚的是如何在gdb中做同样的事情。也就是说,向self发送一条消息,但使用类层次结构中一个级别的实现。在代码中,它与'[super doSomething]'一样简单,但是如果我在gdb中输入了,我会在当前上下文中得到'没有符号'super'。“我试图找出gdb的等价物。 – Jim 2011-05-30 02:51:09

+0

你究竟想要完成什么?你可以在调试器中经历执行objc_msgSendSuper()的麻烦,但是我一直在编写Obj-C代码的时候从来没有这样做的机会。 – NSResponder 2011-05-30 04:27:00

+0

Just wonna在调试时发送消息给super,我有几个很好的理由,太长的用例在这里解释。谢谢。 – Jim 2011-05-30 05:00:27