gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:48:27 24 4
gpt4 key购买 nike

我试过这段代码:

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

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

int main()
{
[Test test];
return 0;
}

在没有任何框架的情况下使用 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)

所以我添加了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

我意识到根类需要一些实现,但我不知道下一步该做什么。创建一个新的根类需要什么?这有什么规范吗?

最佳答案

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

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

@interface MyBase 
+ (void)test;
@end
@implementation MyBase
+ (void)initialize {}
+ (void)test {
// whatever
}
@end

当您第一次使用您的类时,运行时将自动调用 initialize(如 in Apple's documentation 所述)。未实现此方法是消息转发错误的原因。

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

关于objective-c - 实现 Objective-C 的根类需要什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3582209/

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