您好我正在研究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类方法和我知道的实例方法。那么请告诉我方法类的功能是什么。提前谢谢。
答案 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)
答案 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}}方法总是获取对象的类,无论它是否是类对象。)