0

我正在尝试学习objective-c并遇到一些问题。我创建了类 Creature 并使用 Dog 类对其进行了扩展。

但是当我调用方法状态时,返回结果看起来像是从生物类调用的,而不是狗。

github源码链接

ps 如果你发现其他的错误和内存泄漏点,请报告我)

代码:

@interface Creature: NSObject
    - (NSString *)state;
..

@implementation Creature
- (NSString *)state
{
    return [_name stringByAppendingString: ([self isHungry] ? @" is hungry" : @" not hungry")];
}

// Dog 

@interface Dog: Creature
..

@implementation Dog
- (NSString *)state
{
    return [[super state] stringByAppendingString: ([self isFriendly] ? @" and friendly" : @" and unfriendly")];
}

和调用方法

Dog *creature = [Dog CreatureBorn];
NSLog([creature state]);
4

1 回答 1

3

看起来您只有一个 Dog.h 并且没有实现文件 (Dog.m)。因为 Objective-C 是一种动态语言,所以所有类都是在运行时创建的(使用 objc_allocateClassPair() 函数,IIRC)。通过仅拥有一个头文件,您只是向前声明了该类,而实际上并没有创建它。

此外,您的 Dog 类不是从 Creature 继承的,它只是通过 PetProtocol 协议进行确认。Objective-C 中的协议更像 Java 或 C# 中的接口,它们不是类。

在内部,Objective-C 运行时非常简单。它只是归结为一堆 C 函数和结构。如果您有兴趣了解 Objective-C 中的工作原理并且不介意阅读 C 代码,我强烈建议您阅读 Apple 的Objective-C 运行时参考

于 2012-05-03T06:42:03.463 回答