iOS 实例方法和类方法中的self与self.class有什么
2019-12-12 本文已影响0人
某非著名程序员
问题:下面代码中self及self.class区别在哪?
- (void)walkInstance {
[self.class walkClass];
}
+ (void)walkClass{
[self.class walkClass2];
[self walkClass2];
}
-
实例方法
实例方法.png
- self:指的是当前实例对象
- self.class:指的是当前类对象
-
类方法
静态方法.png
- self:指的是当前类对象
- self.class:指的是当前类对象
无论在实例方法还是静态方法中,self.class都是类对象;而在类方法中,self与self.class都是类对象。那么两者有什么区别?
下面是实例方法self.class调用:
//实例对象调用self.class时调用此方法,通过isa指针找到类的class
- (Class)class {
return object_getClass(self);
}
Class object_getClass(id obj)
{
if (obj) return obj->getIsa();
else return Nil;
}
可以看到实例方法中的self.class最终是返回了实例对象的isa指针,而实例对象的isa是指向类对象。
下面是类方法中的self.class调用:
+ (Class)class {
return self;
}
在静态方法中self指的是本身的类对象,self.class仅返回了本身。两者的区别实例对象是通过isa找到类对象,类对象返回的是self本身。