gpt4 book ai didi

命名父类(super class)时的 Objective-C-Runtime Bug "Message"

转载 作者:搜寻专家 更新时间:2023-10-30 19:57:16 25 4
gpt4 key购买 nike

我有以下类层次结构:

@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];
}

测试总是会因 EXC_BAD_INSTRUCTION 而失败。 FooMessagedealloc 中调用它的父类(super class)析构函数,但调用永远不会到达那里。相反,Objective-C 运行时将调用解析为不同的位置: StackTrace and disassembly

如果 Message 基类被重命名为其他东西,例如抽象消息。似乎还有另一个名为 Message 的类,其定义未公开。

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

这是 XCode 3.1。为 iPhone OS 3.0 编译。

最佳答案

Objectve-C 缺少 namespace 的概念。这个问题是众所周知的,通常通过使用前缀命名空间(如 NSObject 或 MKMapView)来解决。您可以将消息类命名为 JrMessage 以避免与名为 Message 的(未记录的)类发生冲突。

编译器只有在知道其他类的情况下才会警告您。对于私有(private)的、未记录的类,情况通常并非如此。处理这个问题的最好方法是通过在每个类上使用前缀来避免冲突。这也有助于防止 future 的冲突,当 Apple 向新版本的操作系统添加类时(编译器显然无法警告)。

编辑:

进一步调查表明,竞争类源自一个名为“MIME.framework”的私有(private)框架,至少在 iPhone 模拟器上是这样:

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 中.

关于命名父类(super class)时的 Objective-C-Runtime Bug "Message",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2849804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com