我在一个方法中使用了NSLog(“%@”,超级)(any method),它正在崩溃.为什么?如何打印超级内容?
更新:
currentclassname : superClassName
{
}此外,如果我使用NSLog(“%@”,超级描述);它是打印"<currentclassname: 0x3db7230>"而不是superClassName.预计它将正确打印superClassName。
提前谢谢你,
发布于 2010-05-27 11:53:58
当遇到关键字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()这样的运行时函数一起使用。
发布于 2010-05-27 11:41:30
使用-description,例如:
NSLog(@"%@", [super description]);如果您可以访问超类,您可以重写它的-description方法来返回您想要的任何信息,或者使用一个类别来增强该类。
发布于 2010-05-27 11:54:24
super是一种向自己发送消息并调用超类实现而不是您自己的实现的方法。它不是一个单独的物体。
NSLog将一个对象作为%@的参数,您要在这里传递的对象是您自己。
坦率地说,我很惊讶这些代码甚至会编译。
如果您想记录超类对您自己的描述,而不是您自己的描述,那么,正如Alex所说,您必须为参数NSLog使用一条NSLog消息。这将使用超类的实现将description消息发送给自己,并将消息返回的对象(作为超类对自己的描述的NSString对象)作为参数传递给NSLog。
但这可能没必要。如果您重写了description,则该实现可以发送[super description]并将该字符串*集成到它创建和返回的描述字符串中。如果您没有覆盖description,那么给self的description消息无论如何都会击中超类的实现。不管怎样,将self而不是super传递给您的NSLog语句。
*有几种方法可以将一个字符串集成到另一个字符串中;有关更多细节,请参见NSString文档。
https://stackoverflow.com/questions/2920657
复制相似问题