У меня есть следующий класс иерархии:
@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. FooMessage
называет это деструктором суперкласса в dealloc
, но вызов туда никогда не поступает. Вместо этого среда выполнения Objective C разрешает вызов в другое место:
![StackTrace and disassembly](https://jorudolph.files.wordpress.com/2010/05/objcmessageruntimebug.png)
Ошибка не возникает, если базовый класс Message
переименован во что-то другое, например, AbstractMessage
. Похоже, есть еще один класс с именем Message
, определение которого не является общедоступным.
Это ошибка? Что на самом деле здесь происходит? Нарушаю ли я какие-либо ограничения именования (хотя я думаю, что компилятор должен предупредить меня об этом)?
Это XCode 3.1. компиляция для iPhone OS 3.0.