Objective-C中称为class的方法的功能是什么

时间:2014-01-15 07:25:25

标签: objective-c initialization self

您好我正在研究Objective-C中的初始化类方法。我遇到了这个困扰我的代码

+ (void)initialize {
    if (self == [Car class]) // what is the use of method class??
    {
        // Makes sure this isn't executed more than once
        _defaultModel = @"Nissan Versa"; // initializing the static variable  _defaultModel
    }
}

我知道我们正在使用 if(self == [Car class])来检查 self 是否指的是类本身。但是 [Car class] 中方法 class 的功能是什么?我是一个新手,我正在学习目标-C几个星期,当我搜索这个问题的答案时,我得到的是不同的b / w类方法和我知道的实例方法。那么请告诉我方法的功能是什么。提前谢谢。

3 个答案:

答案 0 :(得分:4)

这里有两点需要注意。

首先,正如您所说,代码是“使用if (self == [Car class])来检查自我是否是指类本身”。方法class返回Car的类对象,如果在self上调用initialize,则Car将是同一个对象。

其次,initialize的类方法Car如何在除Car之外的其他任何东西上调用 - 它毕竟属于该类?

答案就在于继承。在+initialize的任何实例创建之前,Car的{​​{1}}将被调用一次。但是,在创建该子类的第一个实例之前,它还将为{em> Car的每个子类调用一次。例如。如果你有一个班级:

Car

然后,如果@interface Volvo : Car ... @end 有一个Volvo,则会在创建{em>和 +initialize的{​​{1}}的第一个实例之前调用它。在创建Volvo的第一个实例之前,也会调用{1}}。这就是为什么你经常会看到带有Car语句的类初始值设定项来检查+initialize是否为类本身 - 它确保代码只执行一次而不是每个子类执行一次。

HTH

答案 1 :(得分:1)

[NSObject class]

返回对象的类类型。请参阅Apple的API

(顺便说一下,在这里提问之前,谷歌的API总是很好)

答案 2 :(得分:1)

Cocoa中有两个方法名为class类方法 +[NSObject class]实例方法 -[NSObject class]。他们做了很多不同的事情,所以不要混淆他们。前者为类对象重写后者。

在这里,您要问的是类方法+[NSObject class],这就是我们要讨论的内容。此方法只返回调用它的对象(类对象),类似于-[NSObject self]。实际上,[Car class]也可以写为[Car self]

那么我们为什么要使用一种只返回调用内容的方法呢?为什么不直接使用它所调用的东西?这是由于Objective-C语法的特殊性。在Objective-C中,像Car这样的类名不是一个有效的表达式(不知道为什么;众神就是这样做的)。所以我们不能直接写self == Car,即使这是我们真正想说的。

另一方面,Objective-C有一个特殊情况用于消息发送语法[ ],其中如果左侧的东西是类名,则消息被发送到类对象。因此,获取类的类对象的“解决方法”是使用[ ]语法在其上调用虚拟的“返回自我”方法。在Cocoa / GNUStep / OpenStep框架中,有两种方法可以执行此操作,+class-self。按照惯例,使用了+class(由于与-class的混淆,这实在是非常不幸)。过了一段时间,您将习惯于看到[SomeClass class]并将其解释为SomeClass类对象,而[some_obj class]如果不是some_obj则获得self == Car类类对象。

(注意:在Smalltalk中,Objective-C继承了它的大部分内容,类名类的表达式。所以像class这样的东西就是正确的写入方式。而Smalltalk 中的{{1}}方法总是获取对象的类,无论它是否是类对象。)