博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Object-c Runtime 从代码到代码
阅读量:4982 次
发布时间:2019-06-12

本文共 1567 字,大约阅读时间需要 5 分钟。

关于Object C 中object, Class, Meta Class 的关系,在objc4的源代码中有如下的调用:

LibObjc 动态库被调用后,下面的函数会依次调用

asm

_map_images:

...

jmp _map_2_images

map_2_images ->

map_images_nolock ->

_read_images ->

_objc_connect_classes_from_image ->

connect_class ->

really_connect_class ->

set_superclass 

 

/***********************************************************************

* objc_allocateClass.

**********************************************************************/

void set_superclass(Class cls, Class supercls, bool cls_is_new)

{

    Class meta = cls->ISA();

 

    if (supercls) {

        cls->superclass = supercls;

        meta->superclass = supercls->ISA();

        meta->initIsa(supercls->ISA()->ISA());

 

        // Propagate C++ cdtors from superclass.

        if (supercls->info & CLS_HAS_CXX_STRUCTORS) {

            if (cls_is_new) cls->info |= CLS_HAS_CXX_STRUCTORS;

            else cls->setInfo(CLS_HAS_CXX_STRUCTORS);

        }

 

        // Superclass is no longer a leaf for cache flushing

        if (supercls->info & CLS_LEAF) {

            supercls->clearInfo(CLS_LEAF);

            supercls->ISA()->clearInfo(CLS_LEAF);

        }

    } else {

        cls->superclass = Nil// superclass of root class is nil

        meta->superclass = cls; // superclass of root metaclass is root class

        meta->initIsa(meta);    // metaclass of root metaclass is root metaclass

 

        // Root class is never a leaf for cache flushing, because the 

        // root metaclass is a subclass. (This could be optimized, but 

        // is too uncommon to bother.)

        cls->clearInfo(CLS_LEAF);

        meta->clearInfo(CLS_LEAF);

    }    

}

 

set_superclass 中的注释明确的说明了Class, meta Class,  Class Isa,  meta Isa, Class Super Class, meta super Class 之间的关系和赋值。

转载于:https://www.cnblogs.com/gshe/p/5191045.html

你可能感兴趣的文章
[QT][SQLITE]学习记录二 日期查询
查看>>
hdu 4455 Substrings
查看>>
web传参
查看>>
Python 查找binlog文件
查看>>
Git——如何将本地项目提交至远程仓库
查看>>
Convert CString to std::string
查看>>
3 - Selenium元素定位和操作
查看>>
GCC C语言 DLL范例,含源码
查看>>
冲刺第一天(补发)
查看>>
iOS开发Xcode中切换显示语言实现国际化
查看>>
C++模板学习
查看>>
nginx
查看>>
大数据平台搭建-hadoop集群的搭建
查看>>
安装一些包管理的记录 win10
查看>>
Android RecyclerView notifyDataSetChanged不起作用
查看>>
AndroidStudio3.0 Canary 8注解报错Annotation processors must be explicitly declared now.
查看>>
Android 一个改进的okHttp封装库
查看>>
genymotion下载出现Unable to create virtual device,Server returned HTTP status code 0.
查看>>
Android 下拉刷新框架实现
查看>>
ViewPager + Fragment实现滑动标签页
查看>>