zoukankan      html  css  js  c++  java
  • objc中类方法里的self指的是什么

    所有转出“博客园”,请您注明出处:http://www.cnblogs.com/xiaobajiu/p/4121431.html

    objc中类方法里的self指的是什么

      在objc中是可以在类方法中使用self这个关键字的,这一点和其他语言比较比较诡异,因为很容易导致混淆和失误。而一般在对象方法中使用self/this这个关键字往往指的是当前对象。那么在objc中的类方法中的self指的是什么呢,请看下面一段进行测试的代码:

    #import <Foundation/Foundation.h>
    
    @interface MyClass : NSObject
    @end
    @implementation MyClass
    + (void)show
    {
        Class p1= self;
        Class p2= [MyClass class];
        NSString *re= p1==p2?@"YES":@"NO";
        NSLog(@"%@",re);
    }
    @end
    
    int main(int argc, const char * argv[])
    {
        @autoreleasepool {
            [MyClass show];
            //得到结果为YES
        }
        return 0;
    }

      通过以上代码可以得到以下信息:

      类方法中self是一个Class,而Class 是一个指向 objc_class 结构体类型的指针。objc_class就是Objective-C的类。它定义如下:

    typedef struct objc_class *Class;
    
    struct objc_object {
        Class isa  OBJC_ISA_AVAILABILITY;
    };

      可以发现Class给我们的是一个叫做isa的指针,那么isa是什么呢?继续查看Objective-C的类结构

    struct objc_class {
        Class isa  OBJC_ISA_AVAILABILITY;
    
    #if !__OBJC2__
        Class super_class                                        OBJC2_UNAVAILABLE;
        const char *name                                         OBJC2_UNAVAILABLE;
        long version                                             OBJC2_UNAVAILABLE;
        long info                                                OBJC2_UNAVAILABLE;
        long instance_size                                       OBJC2_UNAVAILABLE;
        struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
        struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
        struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
        struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
    #endif
    
    } OBJC2_UNAVAILABLE;

      可以发现isa指针指向类的“元类”(metaclass),类型也是一个对象,我更喜欢把它叫做类型对象与之相对的就是熟悉的实例对象。正如对象可以接收的信息由类定义一样,类需要的信息就是由“元类”定义。值得指明的是Objective-C类也是对象。千万不要把isa和super_class弄混淆了。元类只跟发往类的消息有关,跟类的实例没有关系。可以观察到instance_size这样的信息,它定义了类的实例的尺寸,当实例化一个类的时候它就负责确保足够的内存空间。

      那么我们也清楚了类方法中的self是什么了,它等价于调用[类 Class],Class又返回给我们isa指针,isa是指向类型对象的。类型对象是这个的信息它只有一份。可以得到结论:类方法中的self是当前类的类型对象

    欢迎各位朋友指正错误,以免误人子弟。

  • 相关阅读:
    Linux 详细命令操作大全二
    Liunx 环境安装配置Jupyter
    Linux 详细命令操作大全一
    Mysql int(10)和int(11)区别
    Python 面向对象编程
    Oracle数据库工具设置时间显示格式
    vue安装时报错:npm WARN deprecated urix@0.1.0: Please see https://github.com/lydell/urix#deprecated
    Oracle对当前时间的处理
    Oracle合并不同条件下统计出的总数
    记录一下vue-cli3搭建项目后遇到axios请求跨域的问题
  • 原文地址:https://www.cnblogs.com/xiaobajiu/p/4121431.html
Copyright © 2011-2022 走看看