• ios


    今天身体不舒服,还顶着写这篇博客。

    举个例子,我们之前在写objective-c代码时,经常用到id这个关键字。那 id 究竟是什么?在objective-c的运行时,这样描述的,它其实是一个结构体(struct)objc_object

    struct objc_object {
       Class isa;
    };

    Class究竟是什么呢?其实它也是一个结构体,定义为如下:typedef struct objc_class *Class。

    再如我们经常用到SEL关键字,那它究竟是什么呢?

    typedef struct objc_selector *SEL;

    A method selector is a C string that has been registered (or “mapped“) with the Objective-C runtime。意思是说一个方法的选择器是一个C的字符串(在objective-c运行时注册)。

    平时,我们经常定义很多方法,调用很多方法。那方法的定义是什么?

    typedef struct objc_method *Method;

    在objective-c中,有些比较奇葩的关键字很容易跟C的关键字混淆。如 BOOL 关键字。它的定义如下:typedef signed char BOOL;噢,竟然是一个不带符号的字符。那 YESNO 又是什么呢? 一看很无语,

    #define YES (BOOL)1
    #define NO  (BOOL)0

    objective - c 里,还有2个奇葩的关键字 nilNil。估计没几个人能够回答出这2个关键字的区别。先看看他们的定义吧。

    #define nil __DARWIN_NULL
    #define Nil __DARWIN_NULL

    从定义上看没有区别,但位置上却有区别。 nil 定义在 MacType.h, 代表是实例是空的。 Nil 定义在 objc/objc.h,  代表是空类。

    我们在写objc代码时,免不了要定义很多属性。那属性在objc里面的定义是怎么样的?typedef struct objc_property *objc_property_t;

    它也是一个结构体...那我们经常使用的retain,weak等关键字会是什么?会是一个结构体吗?答案:NO!它是一个枚举类型。

    enum {
       OBJC_ASSOCIATION_ASSIGN = 0,
       OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
       OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
       OBJC_ASSOCIATION_RETAIN = 01401,
       OBJC_ASSOCIATION_COPY = 01403
    };

    看到很无语. 

    那super又是什么呢?

    struct objc_super
    {
    id receiver;
    Class class;
    };

    结构体嵌套.... 我还有一个疑问,这么庞大的API,它靠什么样的机制区分开来。

    我认真瞄了一下,它应该是有个版本号来管理的。因为它有class_getVersionclass_setVersion.

    objc的函数调用实质是消息分发。

     在runtime,有2个API可以实现, 一个是 objc_msgSend (给一个类的实例发送信息),一个是objc_msgSendSuper (给它的超类发送一个信息)。

     今天先写这么多,后回分解!

  • 相关阅读:
    暴力程序之回文子串
    关于取消同步带来问题的样例
    JavaScript之Date
    JavaScript之array
    智破连环阵
    超长数字串
    无向图最短路径
    扫雷
    n!最末尾非0数
    计算程序运行时间
  • 原文地址:https://www.cnblogs.com/luoguoqiang1985/p/3607889.html
Copyright © 2020-2023  润新知