IOS----runtime class

本文详细解析了Objective-C中类的内部结构,包括objc_class、class_rw_t等关键结构体的定义及其作用,同时介绍了方法缓存(bucket_t)的工作原理及如何通过哈希计算将方法存储到缓存中。

看源码

struct objc_class : objc_object {

    // Class ISA;

    Class superclass;

    cache_t cache;             // formerly cache pointer and vtable

    class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags

    class_rw_t *data() const {

        return bits.data();

    }

.........................

}

cache_t cache;  方法缓存; class_data_bits_t bits; 用于获取到具体类的信息。

struct class_rw_t {

    // Be warned that Symbolication knows the layout of this structure.

    uint32_t flags;

    uint16_t witness;

#if SUPPORT_INDEXED_ISA

    uint16_t index;

#endif

 

    explicit_atomic<uintptr_t> ro_or_rw_ext;

 

    Class firstSubclass;

    Class nextSiblingClass;

 

private:

    using ro_or_rw_ext_t = objc::PointerUnion<const class_ro_t *, class_rw_ext_t *>;

。。。。。

}

struct class_ro_t {

    uint32_t flags;

    uint32_t instanceStart;

    uint32_t instanceSize;

#ifdef __LP64__

    uint32_t reserved;

#endif

 

    const uint8_t * ivarLayout;

    

    const char * name;

    method_list_t * baseMethodList;

    protocol_list_t * baseProtocols;

    const ivar_list_t * ivars;

 

    const uint8_t * weakIvarLayout;

    property_list_t *baseProperties;

 

    // This field exists only when RO_HAS_SWIFT_INITIALIZER is set.

    _objc_swiftMetadataInitializer __ptrauth_objc_method_list_imp _swiftMetadataInitializer_NEVER_USE[0];

 

    _objc_swiftMetadataInitializer swiftMetadataInitializer() const {

        if (flags & RO_HAS_SWIFT_INITIALIZER) {

            return _swiftMetadataInitializer_NEVER_USE[0];

        } else {

            return nil;

        }

    }

 

    method_list_t *baseMethods() const {

        return baseMethodList;

    }

 

    class_ro_t *duplicate() const {

        if (flags & RO_HAS_SWIFT_INITIALIZER) {

            size_t size = sizeof(*this) + sizeof(_swiftMetadataInitializer_NEVER_USE[0]);

            class_ro_t *ro = (class_ro_t *)memdup(this, size);

            ro->_swiftMetadataInitializer_NEVER_USE[0] = this->_swiftMetadataInitializer_NEVER_USE[0];

            return ro;

        } else {

            size_t size = sizeof(*this);

            class_ro_t *ro = (class_ro_t *)memdup(this, size);

            return ro;

        }

    }

};

 

struct class_rw_ext_t {

    const class_ro_t *ro;

    method_array_t methods;

    property_array_t properties;

    protocol_array_t protocols;

    char *demangledName;

    uint32_t version;

};

二维数组

class method_array_t :

    public list_array_tt<method_t, method_list_t>

{

    typedef list_array_tt<method_t, method_list_t> Super;

 

public:

    method_array_t() : Super() { }

    method_array_t(method_list_t *l) : Super(l) { }

 

    method_list_t * const *beginCategoryMethodLists() const {

        return beginLists();

    }

    

    method_list_t * const *endCategoryMethodLists(Class cls) const;

 

    method_array_t duplicate() {

        return Super::duplicate<method_array_t>();

    }

};

 

 

class property_array_t :

    public list_array_tt<property_t, property_list_t>

{

    typedef list_array_tt<property_t, property_list_t> Super;

 

public:

    property_array_t() : Super() { }

    property_array_t(property_list_t *l) : Super(l) { }

 

    property_array_t duplicate() {

        return Super::duplicate<property_array_t>();

    }

};

 

 

class protocol_array_t :

    public list_array_tt<protocol_ref_t, protocol_list_t>

{

    typedef list_array_tt<protocol_ref_t, protocol_list_t> Super;

 

public:

    protocol_array_t() : Super() { }

    protocol_array_t(protocol_list_t *l) : Super(l) { }

 

    protocol_array_t duplicate() {

        return Super::duplicate<protocol_array_t>();

    }

};

 

buck_t是如何进行存入哈希表的

001 首先获取到当前的buckts

002 计算mask

003 sel与mask进行哈希计算得到Key值

004 进行一个循环操作

首先判断是key对应的是否为空 如果为空就直接存入集合,容量增加1

如果是key对应的值存在,就返回

直到下一个位置为空

 

bucket_t *b = buckets();

    mask_t m = capacity - 1;

    mask_t begin = cache_hash(sel, m);

    mask_t i = begin;

 

    // Scan for the first unused slot and insert there.

    // There is guaranteed to be an empty slot because the

    // minimum size is 4 and we resized at 3/4 full.

    do {

        if (fastpath(b[i].sel() == 0)) {

            incrementOccupied();

            b[i].set<Atomic, Encoded>(sel, imp, cls);

            return;

        }

        if (b[i].sel() == sel) {

            // The entry was added to the cache by some other thread

            // before we grabbed the cacheUpdateLock.

            return;

        }

    } while (fastpath((i = cache_next(i, m)) != begin));

 

【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统优化算法进行对比分析。研究内容涵盖路径规划的多目标优化、避障策略、航路点约束以及算法收敛性和寻优能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能优化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻优方面的优势。; 适合人群:具备一定Matlab编程基础和优化算法知识的研究生、科研人员及从事无人机路径规划、智能优化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能优化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标优化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能优化算法的研究与改进中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值