Objective-C:我对子类化不了解的东西

时间:2014-04-07 14:11:07

标签: objective-c nsstring

我不了解Objective-C中的子类化:例如,我们说NSString继承自NSObject,但NSObject是否也继承了NSString? 我想知道这一点,因为当我创建一个继承自NSObject的新类时,即使我的类没有从NSString继承,我也可以访问NSString。 例如,我可以在继承NSObject形式的类中编写它:

[NSString stringWithFormat:@"Hello world !"];

我不明白的是,即使NSString是NSObject的子类而不是它的超类,我也能做到这一点! !

4 个答案:

答案 0 :(得分:3)

当你这样称呼时:

[NSString stringWithFormat:@"Hello world !"];

您正在向stringWithFormat:发送NSString,{{1}}将其定义为静态方法(或者更好的术语,类方法)。它与你班级的超类无关。您正在混淆目标C和OOP的基本概念。子类化意味着继承'特征'原始类,并最终扩展其功能。这并不意味着你不能打电话给其他班级。方法

答案 1 :(得分:2)

您可以访问NSString的原因是您提供了导入Foundation。 Foundation包括NSObject和NSProxy中提供的两个公共基类。 你几乎需要所有的Foundation都有一个可行的Objective-C库,除非你是从头开始实现自己的。那你就要做很多工作。

在C语言或其他语言中也是如此。语言实现提供了一些核心标准库,为您提供了工作的基础。

有些部分实际上是宏,有些是函数。有些是常见的必需品

答案 2 :(得分:1)

你误解了子类化。

stringWithFormat:NSString上的静态方法(类方法)。您可以在子类中创建其他类的对象(假设您具有必要的导入),但是您不能访问类上的方法,除非它是子类并继承该方法,或者定义方法本身。

e.g。

YourClass *testClass;

[testClass testMethod:@"Test"];

除非testClass从定义testMethod:的类继承,或者自己定义它,否则这将失败。

答案 3 :(得分:0)

我是Objective-C编程的完全初学者,事实上我对此感到困惑:
我从理论上读到,子类是继承自其超类的方法而不是相反,所以我只是想如果我能够在一个来自NSObject的子类的类中访问NSString,那就意味着NSObject在访问NSString方法的事实(由于NSString是NSObject的子类,因此不是逻辑)。

最后,我刚才意识到如果我能够访问NSString,那只是因为在我的标题中“包含”了Fundation.h:

#import <Fundation/Fundation.h>