Objective-C:[ClassName self];是什么意思?

10
我正在查看CocoaHTTPServer项目的源代码,更具体地说是HTTPServer.m文件,但我就是不理解这一行代码的含义:
connectionClass = [HTTPConnection self];
这段代码的作用是什么(有没有相关文档)?它是如何编译的?难道不应该是

吗?
connectionClass = [HTTPConnection class];

1
实际上,很明显在类上调用方法self会返回该类。棘手的部分是为什么在类上调用方法class会返回该类而不是它的元类 :) - Sulthan
2
我真的希望人们使用[ClassName self]而不是[ClassName class]。这将减少+class-class之间的混淆。但唉,现在这种写法已经根深蒂固了。 - user102008
@Sulthan:另外,为了增加混乱,Smalltalk中ClassName class确实会返回元类;) - user102008
4个回答

3

[Classname self] 等同于 [Classname class],并返回对 class 对象的引用。

这里有一个小例子:

#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) {
NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];

NSLog(@"Output 1: %@ address:%x",[NSString self], [NSString self]);
NSLog(@"Output 2: %@ address:%x",[NSString class], [NSString class]);

[p release];

输出:

2012-02-22 15:36:13.427 Untitled[1218:707] Output 1: NSString address:7b306a08
2012-02-22 15:36:13.428 Untitled[1218:707] Output 2: NSString address:7b306a08

我猜我感到困惑是因为在NSObject协议中声明的self方法是一个实例方法而不是类方法 - (id)self。所以这是因为Class本身是一个可以接收self消息的Objective-C对象吗? - jbat100
当然是的。当你声明一个类方法时,实际上是在类中添加一个实例方法。请注意,你可以在子类中重写一个类方法。请参阅https://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocObjectsClasses.html。 - Sulthan

3
在这个上下文中,- (id)self是在NSObject上定义的一个方法。它返回接收者。对于一个Class,它显然应该与调用-(Class)class相同。

因此,类对象是完整的对象,可以动态类型化,接收消息,并从其他类继承方法。它们只是特殊的,因为它们是由编译器创建的。


1
谢谢,我找到了一篇有趣的文章http://cocoawithlove.com/2010/01/what-is-meta-class-in-objective-c.html,描述了类/元类。相关部分:*Objective-C中的每个类本身都是一个对象。这意味着Class结构必须以isa指针开头,以便与objc_object二进制兼容。* - jbat100
谢谢提问。在回答这个问题的过程中,我学到了很多东西。 - Sulthan
应该使用+(Class)class,而不是-(Class)class,因为后者会执行完全不同的操作。 - user102008

2

[className self];[className class];相同,返回类对象。
例如:

id object = [getSystemEventsAppDelegate self];
id object1 = [getSystemEventsAppDelegate class];  

enter image description here


-2
在非常基本的層面上,self 是對當前物件的引用,您將其作為變量傳遞給(在這種情況下)HTTPConnection,然後將該方法的結果分配給該變量。
因此,如果您查看HTTPConnection,您將能夠看到它如何使用該物件引用以及它將返回什麼。

1
你在说什么?HTTPConnection不是一个方法,即使它是,那也不是在消息中传递参数的正确语法。 - BoltClock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接