Objective C 继承:未定义的符号

Objective C inheritance: undefined symbols

为什么此代码无法构建?

我有以下文件:

shape.h:

#import <Foundation/Foundation.h>
@interface Shape : NSObject{}
    -(double)getArea;
    -(void)Log;
@end

circle.h:

#import "Shape.h"
@interface Circle : Shape {}
@property (assign, nonatomic, readwrite) double radius;
@end

circle.m:

#import "Circle.h"
#include <math.h>
@implementation Circle : Shape
-(void)setRadius:(double)radius{}
-(double)getArea{
    return self.radius * self.radius * M_PI;
}
-(void)Log{
    NSLog(@"The circle has an area of %f.", self.getArea)
}
@end

main.m:

#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "Circle.h"
int main(int argc, char * argv[]) {
    Circle *c = [Circle alloc];
    c.radius = 10;
    [c Log];    
    return 0;
}

而且我有构建错误:

Undefined symbols for architecture x86_64:

我错过了什么?

您应该创建一个包含这些方法默认实现的 shape.m 文件,或者根据您的需要将其设为协议。

在 Obj-C 中,@interface 声明了一个 class。所有 classes 还需要有 @implementation。在所有类 C (C/C++/Obj-C) 语言中,头文件是一个承诺 - "what you see here is implemented somewhere"。如果未实现承诺(缺少实现),则会出现编译(链接)错误。

在这种情况下,您缺少 Shape class 的实现。

我能理解您的困惑,尤其是当您来自一种 interface 表示一组抽象方法的语言时。在Obj-C中,类似的东西叫做@protocol。此外,Obj-C 中没有抽象 methods/classes 。声明的每个方法也必须实现(除非它是协议 @optional 方法)。