下面的程序会输出什么?
@implementation Son : Father
- (id)init
{
self = [super init];
if (self)
{
NSLog(@”%@”, NSStringFromClass([self class]));
NSLog(@”%@”, NSStringFromClass([super class]));
}
return self;
}
@end
答案:两句输出语句均输出:Son
为什么? 简单来说,self和super都是指向当前实例的,不同的是,[self class]会在当前类的方法列表中去找class这个方法,[super class]会直接开始在当前类的父类中去找calss这个方法,两者在找不到的时候,都会继续向祖先类查询class方法,最终到NSObject类。 由于我们在Father和Son中都没有去重写class这个方法,最终自然都会去执行NSObject中的class方法,结果也自然应该是一样的。 至于为什么是Son,我们可以看看NSObject中class的实现:
-(Class)class
{
return object_getClass(self);
}
这就说的通了,返回的都是self的类型,self此处正好就是Son,因此结果就会输出Son