首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSLog(“%”,超级)崩溃

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

Stack Overflow用户
提问于 2010-05-27 11:30:30
回答 5查看 662关注 0票数 2

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

更新:

代码语言:javascript
复制
currentclassname : superClassName
{
}

此外,如果我使用NSLog(“%@”,超级描述);它是打印"<currentclassname: 0x3db7230>"而不是superClassName.预计它将正确打印superClassName。

提前谢谢你,

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-05-27 11:53:58

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

objc_msgSendSuper*()调用得到一个类型为objc_super*而不是objc_object*的参数

代码语言:javascript
复制
struct objc_super {
   id receiver;
   Class class;
};

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

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

票数 5
EN

Stack Overflow用户

发布于 2010-05-27 11:41:30

使用-description,例如:

代码语言:javascript
复制
NSLog(@"%@", [super description]);

如果您可以访问超类,您可以重写它的-description方法来返回您想要的任何信息,或者使用一个类别来增强该类。

票数 3
EN

Stack Overflow用户

发布于 2010-05-27 11:54:24

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

NSLog将一个对象作为%@的参数,您要在这里传递的对象是您自己。

坦率地说,我很惊讶这些代码甚至会编译。

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

但这可能没必要。如果您重写了description,则该实现可以发送[super description]并将该字符串*集成到它创建和返回的描述字符串中。如果您没有覆盖description,那么给selfdescription消息无论如何都会击中超类的实现。不管怎样,将self而不是super传递给您的NSLog语句。

*有几种方法可以将一个字符串集成到另一个字符串中;有关更多细节,请参见NSString文档

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2920657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档