Приведенный выше пример прекрасно компилируется с gcc и GNU-runtime.В Objective-C обычно любой класс может быть корневым, просто не имея суперкласса.Если среда выполнения Apple требует чего-то другого, то это специфично для среды выполнения.
Кроме того, есть кое-что специфическое для корневых классов:
Все методы экземпляра также являются методами класса с одинаковой реализацией (если не явнореализовано иначе).Вывод следующего приложения:
#import <stdio.h>
@interface Test
+ alloc;
+ (void)test;
- (void)test;
- (void)otherTest;
@end
@implementation Test
+ alloc
{
return (id)class_create_instance(self);
}
+ (void)test
{
printf("class test\n");
}
- (void)test
{
printf("instance test\n");
}
- (void)otherTest
{
printf("otherTest\n");
}
@end
int main()
{
id t = [Test alloc];
[Test test];
[t test];
[Test otherTest];
[t otherTest];
return 0;
}
будет:
class test
instance test
otherTest
otherTest
Самая сложная часть при создании нового корневого класса - это +alloc
и -dealloc
, но, как видно изВ моем примере среда выполнения (в моем случае среда выполнения GNU) может сделать это.Но я не знаю, достаточно ли хорошо выделено время выполнения.Я знаю, что некоторые фонды используют собственный механизм выделения, чтобы скрыть счетчик ссылок от структуры объекта.Я не знаю, делает ли Apple это тоже, и если их среда выполнения уже позаботится об этом.