【发布时间】:2013-07-04 02:46:38
【问题描述】:
考虑:
@interface Foo : NSObject
+ (void) dump ;
@end
@implementation Foo
+ (Class) classOf1 {
return self ;
}
+ (Class) classOf2 {
return [Foo class] ;
}
+ (Class) classOf3 {
return [[[Foo class] new] class] ;
}
+ (Class) classOf4 {
return [[self new] class] ;
}
+ (Class) classOf5 {
return [[[self alloc] init] class] ;
}
+ (Class) classOf6 {
return [[[Foo alloc] init] class] ;
}
+ (Class) classOf7 {
return [self class] ;
}
+ (void) dump {
NSLog(@"classOf1 %@<0x%08.8lx>", [self classOf1], (unsigned long)[[self classOf1] hash]) ;
NSLog(@"classOf2 %@<0x%08.8lx>", [self classOf2], (unsigned long)[[self classOf2] hash]) ;
NSLog(@"classOf3 %@<0x%08.8lx>", [self classOf3], (unsigned long)[[self classOf3] hash]) ;
NSLog(@"classOf4 %@<0x%08.8lx>", [self classOf4], (unsigned long)[[self classOf4] hash]) ;
NSLog(@"classOf5 %@<0x%08.8lx>", [self classOf5], (unsigned long)[[self classOf5] hash]) ;
NSLog(@"classOf6 %@<0x%08.8lx>", [self classOf6], (unsigned long)[[self classOf6] hash]) ;
NSLog(@"classOf7 %@<0x%08.8lx>", [self classOf7], (unsigned long)[[self classOf7] hash]) ;
}
@end
还有输出:
2013-07-04 03:20:20.404 WC[29862:c07] classOf1 Foo<0x0002a2e4>
2013-07-04 03:20:21.075 WC[29862:c07] classOf2 Foo<0x0002a2e4>
2013-07-04 03:20:21.628 WC[29862:c07] classOf3 Foo<0x0002a2e4>
2013-07-04 03:20:22.229 WC[29862:c07] classOf4 Foo<0x0002a2e4>
2013-07-04 03:20:22.805 WC[29862:c07] classOf5 Foo<0x0002a2e4>
2013-07-04 03:20:23.387 WC[29862:c07] classOf6 Foo<0x0002a2e4>
2013-07-04 03:20:25.235 WC[29862:c07] classOf7 Foo<0x0002a2e4>
所有 7 个案例都返回完全相同的值!
对我来说最令人费解的案例:
- classOf1 和 classOf7
在后者中,“self”“代表”Foo,它是一个类。那么什么是类的类呢?
- classOf5 和 classOf6
显然,“Foo”和“self”在这种情况下扮演着完全相同的角色。就像他们在
- classOf3 和 classOf4
在我看来,“Foo”有点像魔法兔子。
你可以
@class Foo ;
以某种方式
@class self ;
没有意义。
在词法分析器到运行时生成器的管道中,我可以理解比特流何时从一堆字符变为 identifier 再到依赖于语言的语义元素。但是我很难弄清楚 ObjC 类标识符的确切性质。
有人吗?
(这个SO Question 似乎无关)
【问题讨论】:
-
我猜在 ObjC 中,类并不是真正的对象(因此没有自己的元类),因此完全有可能在
Class上调用class只是故意返回同一个对象。 -
类是对象,@millimoose,但你句子的后半部分就是答案。
-
@JoshCaswell 对。我对
Class没有被记录为这样,而是作为一个结构而感到困惑。
标签: objective-c