当前位置: 首页 > news >正文

秦皇岛建设局网站6山西省网站建设制作

秦皇岛建设局网站6,山西省网站建设制作,驰业网站建设,营销型网站建设0469z其实好多技术我们用的都很多,但是如果展开其中的细节原理,不一定能说的清楚。今天就说一下我们常用的属性修饰词weak 例子 interface Person : NSObject property (nonatomic, strong) Person *friend; endimplementation Person endint main() {Perso…

其实好多技术我们用的都很多,但是如果展开其中的细节原理,不一定能说的清楚。今天就说一下我们常用的属性修饰词weak

例子

@interface Person : NSObject
@property (nonatomic, strong) Person *friend;
@end@implementation Person
@endint main() {Person *person1 = [[Person alloc] init];Person *person2 = [[Person alloc] init];person1.friend = person2;person2.friend = person1;// 使用 weak 防止循环引用__weak Person *weakPerson = person1;person1 = nil;  // 这里 person1 被释放,weakPerson 自动变为 nilNSLog(@"%@", weakPerson); // 输出:nullreturn 0;
}

在这个例子中,person1person2 之间互相引用。如果我们使用 strong 修饰符,它们会互相持有对方的强引用,从而形成循环引用,导致它们无法释放。但是,当我们将 person1 赋值给 weakPerson 后,weakPerson 不增加 person1 的引用计数,因此当 person1 被置为 nil 时,weakPerson 也会自动被置为 nil

这背后的机制涉及 Side Table 结构和 objc_storeWeakobjc_loadWeak 这两个函数的作用。

核心数据结构

weak 机制主要依赖于两个核心的数据结构:SideTableweak_table_t

1. SideTable

在 Objective - C 运行时中,存在多个 SideTable 实例,这些实例被组织成一个全局的哈希表。每个 SideTable 结构体包含三个主要成员:

struct SideTable {spinlock_t slock;  // 自旋锁,用于保证线程安全RefcountMap refcnts;  // 引用计数表,记录对象的引用计数weak_table_t weak_table;  // 弱引用表,记录对象的弱引用信息
};
2. weak_table_t

weak_table_tSideTable 中的弱引用表,其结构如下:

struct weak_table_t {weak_entry_t *weak_entries;  // 弱引用条目数组size_t    num_entries;  // 弱引用条目数量uintptr_t mask;  // 哈希表的掩码,用于计算哈希索引uintptr_t max_hash_displacement;  // 最大哈希冲突位移
};
  • weak_entries:是一个指向 weak_entry_t 数组的指针,每个 weak_entry_t 记录了一个对象的所有弱引用信息。
  • num_entries:表示当前弱引用条目的数量。
  • mask:用于计算对象在 weak_entries 数组中的哈希索引。
  • max_hash_displacement:记录了在处理哈希冲突时的最大位移量。
3. weak_entry_t

weak_entry_t 结构体用于存储一个对象的所有弱引用信息,其结构如下:

typedef struct weak_entry_t {DisguisedPtr<objc_object> referent;  // 被引用的对象union {struct {weak_referrer_t *referrers;  // 弱引用指针数组uintptr_t        out_of_line_ness : 2;  // 是否使用外部存储标志uintptr_t        num_refs : PTR_MINUS_2;  // 弱引用指针数量uintptr_t        mask;  // 哈希表的掩码,用于计算哈希索引uintptr_t        max_hash_displacement;  // 最大哈希冲突位移};struct {// 内联存储,用于存储少量弱引用weak_referrer_t  inline_referrers[WEAK_INLINE_COUNT];};};
} weak_entry_t;
  • referent:是一个伪装指针,指向被引用的对象。
  • referrers:是一个指向 weak_referrer_t 数组的指针,weak_referrer_t 实际上就是 objc_object ** 类型,用于存储所有指向该对象的弱引用指针。
  • num_refs:记录了当前对象的弱引用指针数量。

实现流程

1. 弱引用的创建

当使用 __weak 修饰一个变量并指向一个对象时,会调用 objc_initWeak 函数,该函数的主要流程如下:

  • 检查对象是否为 nil,如果为 nil,则直接将弱引用指针置为 nil
  • 调用 storeWeak 函数,在 SideTable 中查找对应的 weak_table_t,并在其中为对象创建一个 weak_entry_t 条目,将弱引用指针添加到该条目的 referrers 数组中。
2. 弱引用的销毁

当被引用的对象即将被释放时,会调用 objc_destroyWeak 函数,该函数的主要流程如下:

  • 调用 storeWeak 函数,在 SideTable 中查找对应的 weak_table_tweak_entry_t 条目。
  • weak_entry_treferrers 数组中移除该弱引用指针。
  • 如果 weak_entry_t 中的弱引用指针数量变为 0,则从 weak_table_t 中移除该条目。
3. 对象释放时弱引用的置为 nil

当对象的引用计数变为 0 并即将被释放时,会调用 objc_dealloc 函数,该函数会进一步调用 weak_clear_no_lock 函数,该函数的主要流程如下:

  • SideTable 中查找对应的 weak_table_tweak_entry_t 条目。
  • 遍历 weak_entry_treferrers 数组,将所有弱引用指针置为 nil
  • weak_table_t 中移除该 weak_entry_t 条目。

http://www.dtcms.com/a/522822.html

相关文章:

  • 正规的网站制作服务商如何做网站进行推广
  • 做网站 属于电子商务济南简单的网站制作
  • 网站开发页面福州公司网站建设
  • 高端品牌网站建设公司哪家好wordpress 作者插件
  • 集团门户网站建设方案wordpress二级
  • 做网站怎么租个空间WordPress成绩查询
  • 广州上市网站建设的公司上海公共招聘平台
  • ps网站CAD做PS地砖贴图看网站搜什么关键词
  • 如何做网站英文简历模板禅城网页设计
  • 广州网站建设网站定制想建设一个网站 一般多少钱
  • 在网站后台管理系统里产品说明怎么添加图片做淘宝客网站备案要怎么写
  • 贵阳商城网站开发表情包在线制作网站
  • 山东一建建设有限公司网站首页外贸网站 服务器
  • 网站开发报价微信手机网站app制作
  • 有没有专门发布毕业设计代做网站济南网站建设运营
  • 网站开发项目需要哪些人员策划师龙华网站建设推广平台
  • 织梦学校网站源码西安手机网站开发
  • 问什么出现 这个网站正在建设中软件开发工具平台
  • .net电影网站开发表示商业网站的域名
  • 包头移动官网网站建设企业云服务
  • 厦门海沧建设局网站晋中市科技馆网站建设
  • 用网站做平台有哪些app网站
  • 免费建站网站一级大录像不卡查询域名注册信息
  • 重庆网站建设公司推荐网站原型设计和版式设计
  • 新开传奇网站195合击做广告公司网站建设价格
  • 房地产网站建设联系方式做瑷网站
  • 模板建站ftp上传不了wordpress
  • 网站开发用什么网站WordPress获取文章总数
  • 上海专业网站制作开发网站请及时续费
  • 可以直接进入的舆情网站wordpress主题dux 5.0