代码之家  ›  专栏  ›  技术社区  ›  Johannes Rudolph

Objective-C-命名超类“Message”时出现运行时错误

  •  3
  • Johannes Rudolph  · 技术社区  · 15 年前

    @interface Message : NSObject {}
    @end
    
    @implementation Message
    - (void) dealloc
    {
        // I won't be called
        [super dealloc];
    }
    @end
    
    @interface FooMessage : Message {}
    @end
    
    @implementation FooMessage
    - (void) dealloc
    {
        // should call Message - dealloc
        [super dealloc];
    }
    @end
    

    以及以下单元测试:

    - (void) test
    {
        FooMessage* msg = [[FooMessage alloc] init];
        [msg release];
    }
    

    FooMessage 称之为超类析构函数 dealloc StackTrace and disassembly

    如果 Message 基类被重命名为其他类,例如。 AbstractMessage . 似乎还有另一个类名为 ,其定义尚未公开。

    这是虫子吗?这里到底发生了什么?我是否违反了任何命名限制(即使我认为编译器应该警告我)?。

    1 回复  |  直到 9 年前
        1
  •  8
  •   Nikolai Ruhe    15 年前

    Objectve-C缺少名称空间的概念。这个问题是众所周知的,通常通过使用前缀名称空间(如 纳什 迈克科尔斯 地图视图)。你可以命名你的消息类 JrMessage Message .

    编译器只能在知道另一个类时发出警告。对于私有的、没有文档的类,情况往往不是这样。最好的处理方法是通过在每个类上使用前缀来避免冲突。这也有助于防止将来的冲突,当苹果在新版本的操作系统中添加类时(编译器显然无法对此发出警告)。

    编辑:

    NSLog(@"Message class: %@", [[NSBundle bundleForClass:NSClassFromString(@"Message")] bundlePath]);
    
    ... Message class: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/System/Library/PrivateFrameworks/MIME.framework
    

    您可能需要在 bug report