【iOS】class-dump源码学习(四)源码学习完结

上一篇:【iOS】class-dump源码学习(三)

续上一篇讲讲CDObjectiveCProcessor的process方法中加载协议和类,今天继续process方法中CDObjectiveC2Processor的loadCategories方法分析


- (void)loadCategories;
{
    CDSection *section = [[self.machOFile segmentWithName:@"__DATA"] sectionWithName:@"__objc_catlist"];
    
    CDMachOFileDataCursor *cursor = [[CDMachOFileDataCursor alloc] initWithSection:section];
    while ([cursor isAtEnd] == NO) {
        CDOCCategory *category = [self loadCategoryAtAddress:[cursor readPtr]];
        [self addCategory:category];
    }
}

CDObjectiveC2Processor的loadCategories方法,顾名思义就是一个加载分类的方法

读取__Data段的__objc_catlist区,然后遍历区获得指针([cursor readPtr]),通过loadCategoryAtAddress:构造了CDOCCategory对象之后保存在_categories数组中。

类似加载协议,看一下CDObjectiveC2Processor的loadCategoryAtAddress:方法对获得的指针address如何处理

根据指针address的地址声明一个CDMachOFileDataCursor的对象cursor,开始读取OC分类结构cd_objc2_category的具体字段

    struct cd_objc2_category objc2Category;
    objc2Category.name               = [cursor readPtr];
    objc2Category.class              = [cursor readPtr];
    objc2Category.instanceMethods    = [cursor readPtr];
    objc2Category.classMethods       = [cursor readPtr];
    objc2Category.protocols          = [cursor readPtr];
    objc2Category.instanceProperties = [cursor readPtr];
    objc2Category.v7                 = [cursor readPtr];
    objc2Category.v8                 = [cursor readPtr];

没有和之前协议、类中有太大区别的字段,把cd_objc2_category的字段保存在CDOCCategory类中并返回给loadCategories。

至此loadCategories也完成了,这也意味着CDObjectiveCProcessor的process方法结束了。


回到最初的class-dump.m,我们已经完成了[classDump processObjectiveCData]的分析,接下来关注[classDump registerTypes]

- (void)registerTypes;
{
    for (CDObjectiveCProcessor *processor in self.objcProcessors) {
        [processor registerTypesWithObject:self.typeController phase:0];
    }
    [self.typeController endPhase:0];

    [self.typeController workSomeMagic];
}

感觉这之后的逻辑和数据展示相关,再加上源码学习的时间已经一周,组长已经提出了需求,因此这一次源码学习就到这里,主要是对mach-o文件有了一定认识,之后要进行的开发就和这个内容密切相关。

TODO list:

1.load commands全面认识

2.dyld工作流程

你可能感兴趣的:(iOS学习)