weak 如何将对象置为nil
来源:互联网 发布:淘宝店名设计 编辑:程序博客网 时间:2024/06/11 18:13
我们都知道Weak指针不会增加所引用对象的计数,并在引用对象被回收的时候自动被置为nil
。通常用于解决循环引用问题。那么,自动被置为nil
内部是如何实现的呢?
内部实现 —— Weak表
Runtime维护了一个Weak表,用于存储指向某个对象的所有Weak指针。Weak表其实是一个哈希表,Key是所指对象的地址,Value是Weak指针的地址(这个地址的值是所指对象的地址)的数组。
在对象被回收的时候,经过层层调用,会最终触发下面的方法将所有Weak指针的值设为nil
。(具体定义在objc-weak.m中)
- PRIVATE_EXTERN void
- arr_clear_deallocating(weak_table_t *weak_table, id referent) {
- {
- weak_entry_t *entry = weak_entry_for_referent(weak_table, referent);
- if (entry == NULL) {
- /// XXX shouldn’t happen, but does with mismatched CF/objc
- //printf(“XXX no entry for clear deallocating %p\n”, referent);
- return;
- }
- // zero out references
- for (int i = 0; i < entry->referrers.num_allocated; ++i) {
- idid *referrer = entry->referrers.refs[i].referrer;
- if (referrer) {
- if (*referrer == referent) {
- *referrer = nil;
- }
- else if (*referrer) {
- _objc_inform(”__weak variable @ %p holds %p instead of %p\n”, referrer, *referrer, referent);
- }
- }
- }
- weak_entry_remove_no_lock(weak_table, entry);
- weak_table->num_weak_refs–;
- }
- }
简单来说,这个方法首先根据对象地址获取所以Weak指针地址的数组,然后遍历这个数组把其中的数据设为nil
,最后把这个entry从Weak表中删除。
阅读全文
0 0
- weak 如何将对象置为nil
- 对象回收时Weak指针自动被置为nil的实现原理
- 对象回收时Weak指针自动被置为nil的实现原理
- weak引用在什么时候被置为nil
- weak 属性需要在dealloc中置为nil吗
- runtime如何实现weak变量的自动置nil?
- Objective-C的delloc方法中,将对象置为nil和将对象release的区别
- __weak如何实现对象值自动设置为nil的
- __weak如何实现对象值自动设置为nil的
- strong修饰符实现weak效果(对象释放时,属性置nil)
- NSUserDefaults 中对象为nil和@""
- 如何将ASObject转换为JAVA对象
- 如何将bean转换为json对象
- 如何将json对象转化为字符串?
- js如何将字符串转换为对象
- Java7中如何将Object对象转化为int对象
- JS 如何将函数的this环境置为变量对象
- 对象Free了之后一定要设为nil !
- (转)VeraCrypt : 怎么加密不被发现?
- HDU-4276-The Ghost Blows Light
- 《MOOC大学结束课程网址抓取小工具》
- angularJS——模块加载
- 线程监控
- weak 如何将对象置为nil
- CodeForces 883E Field of Wonders
- 生活
- 二维dp 之 完美序列
- 1362: B. Mr.Z 的四因子数 (改编)
- cs231n笔记之我的笔记3
- Joint Learning of Convolutional Neural Networks and Temporally Constrained Metrics for Tracklet Asso
- 在 CentOS6 安装 Let'sEncrypt 免费SSL安全证书 实现HTTPS
- 生活