考虑:
@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
在后者中,“自我”“代表” Foo 这是一个类。那么一堂课是什么课呢?
- classOf5 和 classOf6
显然,“Foo”和“self”在这种情况下扮演着完全相同的角色。正如他们在
- classOf3 和 classOf4
在我看来,“Foo”有点像魔法兔子。
你可以
@class Foo ;
在某种程度上
@class self ;
没有意义。
在词法分析器到运行时生成器的管道中,我可以理解比特流何时从一堆字符变为一个identifier
依赖于语言的语义元素。但是我很难弄清楚 ObjC 类标识符的确切性质。
任何人?
(这个SO Question似乎无关)