iOS - 底层实现中涉及的类型

ops/2025/1/17 1:07:37/

1. 基本类型定义

// 基础类型
typedef unsigned long       uintptr_t;   // 指针大小的无符号整数
typedef long               ptrdiff_t;    // 指针差值类型
typedef unsigned int       uint32_t;     // 32位无符号整数
typedef unsigned long long uint64_t;     // 64位无符号整数// 掩码类型
typedef uintptr_t          mask_t;      // 用于位掩码操作

2. 对象相关类型

// 对象类型
typedef struct objc_object *id;          // 对象指针
typedef struct objc_class  *Class;       // 类指针
typedef struct method_t    *Method;      // 方法指针// isa 相关
union isa_t {uintptr_t bits;                      // 完整的指针值struct {uintptr_t nonpointer     : 1;    // 是否优化的 isauintptr_t has_assoc      : 1;    // 是否有关联对象uintptr_t has_cxx_dtor   : 1;    // 是否有 C++ 析构函数uintptr_t shiftcls       : 33;   // 类指针// ...其他位域};
};

3. 弱引用相关类型

// 弱引用表结构
struct weak_table_t {weak_entry_t *weak_entries;          // 哈希数组size_t num_entries;                  // 实际条目数uintptr_t mask;                      // 容量掩码
};// 弱引用条目
struct weak_entry_t {DisguisedPtr<objc_object> referent;  // 被引用对象union {struct {weak_referrer_t *referrers;   // 动态数组uintptr_t out_of_line : 1;    // 是否使用动态数组uintptr_t num_refs : PTR_MINUS_1;  // 引用计数};struct {weak_referrer_t inline_referrers[WEAK_INLINE_COUNT]; // 内联数组};};
};

4. 锁相关类型

// 自旋锁
typedef struct {volatile int32_t value;
} OSSpinLock;// 互斥锁
typedef struct {pthread_mutex_t mutex;
} mutex_t;// 读写锁
typedef struct {pthread_rwlock_t lock;
} rwlock_t;

5. 缓存相关类型

// 方法缓存
struct cache_t {struct bucket_t *_buckets;           // 哈希数组mask_t _mask;                        // 容量掩码mask_t _occupied;                    // 已使用数量
};// 缓存桶
struct bucket_t {SEL _key;                           // 方法选择器IMP _imp;                           // 方法实现
};

6. 内存管理类型

// 引用计数类型
typedef struct {size_t refcount;                    // 引用计数值bool weakly_referenced;             // 是否有弱引用
} refcount_t;// 自动释放池页
struct AutoreleasePoolPage {static pthread_key_t key;           // TLS keyid *next;                          // 下一个空位置pthread_t thread;                  // 所属线程AutoreleasePoolPage *child;        // 子页面
};

7. 函数指针类型

// 方法实现类型
typedef id (*IMP)(id, SEL, ...);        // 方法实现指针// 清理函数类型
typedef void (*cleanup_func_t)(void *);  // 清理函数指针// 析构函数类型
typedef void (*dtor_func_t)(id);         // 析构函数指针

8. 枚举类型

// 关联对象策略
typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {OBJC_ASSOCIATION_ASSIGN = 0,          // 弱引用OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,// 强引用非原子OBJC_ASSOCIATION_COPY_NONATOMIC = 3,  // 复制非原子OBJC_ASSOCIATION_RETAIN = 01401,      // 强引用OBJC_ASSOCIATION_COPY = 01403         // 复制
};

总结要点:

1. 类型分类:

  • 基础数值类型
  • 对象相关类型
  • 内存管理类型
  • 同步机制类型

2. 类型特点:

  • 位域优化
  • 内存对齐
  • 平台兼容
  • 性能考虑

3. 使用注意:

  • 类型安全
  • 内存布局
  • 平台差异
  • 性能影响

http://www.ppmy.cn/ops/150682.html

相关文章

利用 Java 爬虫获取 1688 商品评论的实践指南

在电商领域&#xff0c;商品评论是消费者决策的重要参考因素&#xff0c;同时也是商家了解产品反馈、优化服务的关键数据来源。1688 作为国内知名的 B2B 电商平台&#xff0c;拥有海量的商品评论数据。本文将详细介绍如何利用 Java 爬虫技术获取 1688 商品评论&#xff0c;并提…

利用 Python 爬虫获取 1688 商品评论的实践指南

在当今电商蓬勃发展的时代&#xff0c;商品评论成为了消费者决策的重要依据&#xff0c;同时也为商家提供了宝贵的市场反馈。1688 作为国内知名的 B2B 电商平台&#xff0c;拥有海量的商品评论数据。通过 Python 爬虫技术&#xff0c;我们可以高效地获取这些评论数据&#xff0…

启动项目报JVM初始化错误

说明&#xff1a;有次像往常一样启动项目&#xff0c;但是报下面的错误 错误信息&#xff1a; Error occurred during initialization of VM Unable to allocate 261760KB bitmaps for parallel garbage collection for the requested 8376320KB headp.Error&#xff1a;Cou…

68_Redis数据结构-QuickList

1.QuickList介绍 虽然ZipList能够节省内存,但它要求申请的内存空间必须是连续的,当内存占用较高时,这会导致申请内存的效率变得很低。如何解决这一问题?我们可以考虑通过限制ZipList的长度和单个entry的大小来减轻对连续大块内存的需求,从而优化内存申请过程。 当需要存…

上传自己的镜像到docker hub详细教程

上传自己的镜像到docker hub详细教程 本博客通B站视频一致&#xff1a; 上传自己的镜像到docker hub详细教程 1. 登录自己的hub.docker.com的账号 docker hub仓库 2. 点击Repositories&#xff0c;跳转到创建仓库页面 3. 点击Create a repository 创建repository&#xff0c…

Type-C双屏显示器方案

在数字化时代&#xff0c;高效的信息处理和视觉体验已成为我们日常生活和工作的关键需求。随着科技的进步&#xff0c;一款结合了便携性和高效视觉输出的设备——双屏便携屏&#xff0c;逐渐崭露头角&#xff0c;成为追求高效工作和娱乐体验人群的新宠。本文将深入探讨双屏便携…

css盒子水平垂直居中

目录 1采用flex弹性布局&#xff1a; 2子绝父相margin&#xff1a;负值&#xff1a; 3.子绝父相margin:auto&#xff1a; 4子绝父相transform&#xff1a; 5通过伪元素 6table布局 7grid弹性布局 文字 水平垂直居中链接&#xff1a;文字水平垂直居中-CSDN博客 以下为盒子…

宝塔自动备份数据库到阿里云 OSS

1、打开宝塔面板&#xff0c;点击数据库。大家的数据库列表这里多半是空白的&#xff0c;这是因为我们使用了Sequelize来创建数据库。宝塔并不知道我们创建了数据库 依次点击同步数据库&#xff0c;从服务器同步到面板&#xff0c;确定后&#xff0c;就能看到自己的数据库了。 …