为什么要继承NSObject?

use*_*590 23 inheritance objective-c nsobject

Objective-C中NSObject的目的/用途是什么?我看到扩展NSObject的类是这样的:

@interface Fraction : NSObject 
Run Code Online (Sandbox Code Playgroud)

在C++或Java中,我们不使用任何变量,如NSObject,即使我们在Objective-C和Java中都有预处理程序指令和import语句.

为什么类在Objective-C中明确地继承了NSObject?不从NSObject声明继承有什么后果?

Tim*_*Tim 27

我们使用NSObject显式声明给定类继承的内容.我不确定C++,但在Java中有类似的东西 - Object类.唯一的区别是Java不要求类显式地从Object下降 - 该语言假定任何没有指定父类的类都来自Object.Objective-C是不同的,因为它允许您定义不同的根类 - 您可以创建一个不从NSObject继承的类.

这种不同的根类的一个例子是NSProxy.

看一下GNUstep NSObject源代码,它展示了这些方法如何通过C函数与objective-c运行时交互.

+ (id) allocWithZone:(NSZone*)z
{
  return NSAllocateObject(self, 0, z);
}

- (void) dealloc
{
  NSDeallocateObject (self);
}

+ (BOOL) isSubclassOfClass: (Class)aClass
{
  return GSObjCIsKindOf(self, aClass);
}
Run Code Online (Sandbox Code Playgroud)


Qui*_*lor 14

由于面向对象语言具有继承的概念,因此在任何继承层次结构中都有一个根类.在Java中,默认父类(如果没有提供)是java.lang.Object,而在Objective-C中,如果没有显式声明父类,则不会获得父类.从本质上讲,您的类本身就是一个根类.这是Objective-C新手中的常见错误,因为在这种情况下您通常希望从NSObject继承.

虽然经常有问题和令人费解,但这实际上允许相当多的灵活性,因为您可以定义自己的类层次结构,其行为与NSObject完全不同.(Java根本不允许你这样做.)另一方面,除非你知道自己在做什么,否则很容易让自己陷入困境.幸运的是,如果你调用一个没有声明父类的类定义的方法,编译器将提供警告,例如那些你通常希望从NSObject继承的类.

至于NSObject的"使用",请查看NSObject类NSObject协议的文档.它们定义了用于对象分配,内存管理,比较,散列,打印描述,检查类成员资格,查询对象是否响应选择器等的常用方法.基本上,NSObject"很适合"提供Objective-C对象的核心功能免费.


ACB*_*urk 6

所有类都不一定从NSObject继承,但它是许多类的核心,因为它提供了诸如alloc,retain和release之类的东西.