iOS 实例方法和类方法中的self与self.class有什么

2019-12-12  本文已影响0人  某非著名程序员

问题:下面代码中self及self.class区别在哪?

- (void)walkInstance {
    [self.class walkClass];
}

+ (void)walkClass{   
    [self.class walkClass2];
    [self walkClass2];
}
  1. 实例方法


    实例方法.png
  1. 类方法


    静态方法.png

无论在实例方法还是静态方法中,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本身。

上一篇下一篇

猜你喜欢

热点阅读