NSLog(@“%@”,超级)崩溃

时间:2010-05-27 11:30:31

标签: iphone objective-c cocoa cocoa-touch

我在一个方法(任何方法)中使用了NSLog(@“%@”,super)并且它崩溃了....为什么?如何打印超级内容?

更新:

currentclassname : superClassName
{
}

如果我使用NSLog(@“%@”,[超级描述]);它是打印"<currentclassname: 0x3db7230>"而不是superClassName ...它应该打印superClassName。

提前致谢,

5 个答案:

答案 0 :(得分:5)

当遇到关键字 super并对其进行方法调用时,编译器会生成不同的调用 - objc_msgSendSuper*(),而不是通常的objc_msgSend*()

objc_msgSendSuper*()次调用获取objc_super*类型的参数,而不是objc_object*

struct objc_super {
   id receiver;
   Class class;
};

因此,objc_super*值不是特殊实例,必须与特殊objc_msgSendSuper*()函数一起使用。

因此,正如亚历克斯所说,只需直接在-description上调用super - 除非你专门将它与objc_msgSendSuper()这样的运行时函数一起使用,否则它的值在上下文之外是没有意义的。

答案 1 :(得分:3)

使用-description,例如:

NSLog(@"%@", [super description]);

如果您有权访问超类,则可以覆盖其-description方法以返回您想要的任何信息,或者可以使用类别扩充该类。

答案 2 :(得分:1)

super是一种向自己发送消息并调用超类的实现而不是您自己的实现的方法。它不是一个单独的对象。

NSLog将一个对象作为%@的参数,你想要传递给的对象就是你自己。

坦率地说,我对有问题的代码甚至编译感到惊讶。

如果您想记录您的超类对自己的描述而不是您自己的描述,那么,正如Alex Reynolds所说,您必须使用[super description]消息将参数传递给NSLog。这会使用您的超类的实现将description消息发送给您自己,并将该消息返回的对象(作为您自己的超类描述的NSString对象)作为参数传递给NSLog

但这可能没有必要。如果您已覆盖description,则该实现可以发送[super description]并将该字符串*集成到它创建并返回的描述字符串中。如果您没有覆盖description,那么description的{​​{1}}消息将会触及超类的实现。无论哪种方式,都将self而不是self传递给您的super语句。

*有几种方法可以将一个字符串整合到另一个字符串中;有关详细信息,请参阅the NSString docs

答案 3 :(得分:1)

  

如果我使用NSLog(@“%@”,[超级描述]);它是打印<currentclassname: 0x3db7230>而不是superClassName ...它应该打印superClassName。

没有。使用[super aMethod]代替[self aMethod]只会为您提供-aMethod的实现,如果尚未覆盖它,超类将使用它。 [self className][super className]都解析为NSObject的实现(我猜)询问对象的isa实例变量以获取名称。

答案 4 :(得分:0)

试试NSLog(@"%@",[super view]); 或类似[超级任何方法]; 你究竟想从超级目标中获得什么?