实现Objective-C的根类需要什么?

Eon*_*nil 5 class objective-c objective-c-runtime llvm-clang

我试过这段代码:

// main.m
#import <stdio.h>

@interface Test 
+ (void)test;
@end
@implementation Test
+ (void)test
{
    printf("test");
}
@end

int main()
{
    [Test test];
    return  0;
}
Run Code Online (Sandbox Code Playgroud)

如果没有任何框架的LLVM/Clang,它不会编译与此错误:

Undefined symbols:
  "_objc_msgSend", referenced from:
      _main in main.o
ld: symbol(s) not found
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

所以我补充道libobjc.dylib.代码已编译,但抛出了此运行时异常:

objc[13896]: Test: Does not recognize selector forward::
Program received signal:  “EXC_BAD_INSTRUCTION”.

#0  0x9932a4b4 in _objc_error
#1  0x9932a4ea in __objc_error
#2  0x993212b6 in _objc_msgForward
#3  0x99321299 in _objc_msgForward
#4  0x99321510 in _class_initialize
#5  0x99328972 in prepareForMethodLookup
#6  0x99329c17 in lookUpMethod
#7  0x99321367 in _class_lookupMethodAndLoadCache
#8  0x99320f13 in objc_msgSend
#9  0x00001ee5 in start
Run Code Online (Sandbox Code Playgroud)

我意识到root类需要一些实现,但我不知道接下来该怎么做.制作新的根类需要什么?这有什么规格吗?

wby*_*ung 7

我刚谈到这个问题,因为我有同样的"学术"问题.经过一番研究后,我发现这个问题的其他答案并不完全正确.

确实,在Apple Objective-C 2.0运行时,您必须实现某些方法才能使代码正常工作.实际上只需要实现一种方法:类方法initialize.

@interface MyBase 
+ (void)test;
@end
@implementation MyBase
+ (void)initialize {}
+ (void)test {
 // whatever
}
@end
Run Code Online (Sandbox Code Playgroud)

initialize一次使用您的课程时,运行时将自动调用(如Apple的文档中所述).不实现此方法是消息转发错误的原因.

使用clang test.m -Wall -lobjc(或gcc)编译将允许您毫无问题地调用类方法测试.使对象分配工作是一个不同的故事.至少,isa如果您正在使用实例变量,则需要在基类上使用指针.运行时期望它存在.