代码之家  ›  专栏  ›  技术社区  ›  Chandan Shetty SP

nslog(@“%@”,super)崩溃

  •  2
  • Chandan Shetty SP  · 技术社区  · 15 年前

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

    更新:

    currentclassname : superClassName
    {
    }
    

    另外,如果我使用nslog(@“%@”,[超级描述]),它正在打印 "<currentclassname: 0x3db7230>" 而不是超类名称…预计将正确打印超类名称。

    事先谢谢,

    5 回复  |  直到 15 年前
        1
  •  5
  •   Georg Fritzsche    15 年前

    当遇到 关键字 super 以及对它的方法调用,编译器生成不同的调用- objc_msgSendSuper*() 而不是平常 objc_msgSend*() .

    objc_msgsendsuper*() 调用获取类型的参数 objc_super* 而不是 objc_object* :

    struct objc_super {
       id receiver;
       Class class;
    };
    

    所以, 对象超图 值不是特殊的实例,它们必须与特殊的 objc_msgsendsuper*() 功能。

    因此,正如亚历克斯所说,打电话 -description 直接对 超级的 -它的值在其所在的上下文之外是无意义的,除非您将它与运行时函数(如 objc_msgSendSuper() .

        2
  •  3
  •   Alex Reynolds    15 年前

    使用 -description ,例如:

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

    如果您有权访问超类,则可以重写其 -描述 方法返回所需的任何信息,或者用一个类别扩充类。

        3
  •  1
  •   Peter Hosey    15 年前

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

    NSLog 将对象作为参数 %@ 你要经过的是你自己。

    坦率地说,我甚至对所讨论的代码的编译感到惊讶。

    如果你想记录你的超类对你自己的描述,而不是你自己的,那么,正如亚历克斯雷诺兹所说,你必须使用 [super description] 参数的消息 国家统计局 . 这发送了 description 使用超类的实现向自己传递消息,并将该消息返回的对象(超类对自己的描述的nsstring对象)作为参数传递给 国家统计局 .

    但这可能不是必要的。如果您已重写 描述 ,该实现可以发送 [超级描述] 并将该字符串*集成到它创建和返回的描述字符串中。如果你没有重写 描述 然后 描述 消息到 self 无论如何都会影响超类的实现。不管怎样,传球 自己 不是 超级的 对你 国家统计局 声明。

    *有几种方法可以将一个字符串集成到另一个字符串中;请参见 the NSString docs 了解更多详细信息。

        4
  •  1
  •   JeremyP    15 年前

    另外,如果我使用nslog(@“%@”,[超级描述]),它正在打印 <currentclassname: 0x3db7230> 而不是超类名称…预计将正确打印超类名称。

    不使用 [super aMethod] 而不是 [self aMethod] 只给出了超类在没有被重写的情况下将使用的-amethod的实现。 [self className] [super className] 这两个问题都解决了nsObject的实现问题(我猜)询问了对象的 isa 获取名称的实例变量。

        5
  •  0
  •   jAmi    15 年前

    尝试 NSLog(@"%@",[super view]); 或像[超级任何方法]一样进行的花束; 你想从超级中学到什么?