强引用,弱引用

iOS 保留周期与弱引用

在ios5.0 dev的page325中,说到了保留周期的问题

1,什么是保留周期:

它指的是这样一种情况:两个或者更多对象以一种循环的方式相互保留。

只要有两个需要引用对方的对象,通常就希望“所有者”对象保留另一个对象,但另一个对象绝对不能保留它的所有者。

这也就是为什么像控件对象的代理属性都是弱属性了。

因为代理对象比如MyViewController持有UITextField的控件对象。那么UITextFiled对象的属性是强属性,因为MyViewController对象保留UITextFiled对象。

UITextFiled对象自己会有Delegate属性,那么Delegate这个对象一般是MyViewController,那么UITextFiled对象保留MyViewController对象(也就是Delegate对象),

MyViewController对象为弱属性(也就是Delegate对象).如果Delegate对象也是强属性的话,他们就相互保留了,引用计数器永远都是1,他们永远不被释放了.



、、、、、、、、、、、、、、、、、、、、、、、、、、

delegate为什么用弱引用?

比如在A页面设置B的delegate为A的实例, 

// A.m中某处
B* b = [B alloc] init];
b.delegate = self;
[self.view addSubview:b];
[b release];
那么
1.是A负责创建B的,A的生命周期一定比B要长(B存在,A一定也存在;A存在,B不一定存在)
也就是说 在B(实例b)存在的时候,A(的实例)一定存在, 所以没有必要用retain将引用计数+1,assign足以
 
2.退一步假设存在这样的情况:A比B先挂掉(A的实例先被release销毁)
那么当然希望是[a relase]后,A中的方法不再被B调用,但是使用retain时候,A还是没有被销毁,所以 A中的方法仍会被B调用,但是assgin就无此问题
 
3.本质上delegate就是一根指向先于它存在的某个类(CCClass)的指针(假设是:ccPoint),我们通过delegate这根指针去指向这个已经存在的指针(ccPoint) 那么通过delegate即ccPoint也就可以访问CCClass中的实例方法
 
4.避免retain cycle,即:有A,B两个Object, A中有一个B的实例变量,B中又有一个A的实例变量,要release A就必须releaseA中的B,而要release B有必须release B中的A,这样就产生了一个Retain Circle,A B都不能被dealloc.解决Retain Circle的方法就是使用弱引用(weak reference),弱引用没有被引用的那个Object的所有权,也就不需要release它,从而解决了Retain Circle问题.为了防止Retain Circle的发生, delegate通常都是弱引用的, 因此我们一般不应该retain一个delegate。NSURLConnection是个例外。


### Java 中强引用弱引用的区别 #### 强引用 (Strong Reference) 强引用是最常见的引用类型,在Java中,通过简单的赋值操作即可创建强引用。只要存在强引用指向某个对象,则该对象就不会被垃圾回收机制所回收。 ```java Object obj = new Object(); ``` 上述代码片段展示了如何创建一个强引用实例[^1]。当程序不再需要此对象时,应显式解除引用或将变量设置为`null`以便让垃圾收集器能够回收资源。 #### 弱引用 (Weak Reference) 相比之下,弱引用是一种较弱形式的引用关系,它不会阻止目标对象成为垃圾回收的目标。即使当前内存空间充足,一旦触发GC周期,持有弱引用的对象也会被清理掉。为了实现这一点,可以利用`java.lang.ref.WeakReference<T>`类来构建弱引用: ```java import java.lang.ref.WeakReference; String str1 = new String("abc"); WeakReference<String> weakRefStr = new WeakReference<>(str1); ``` 这段代码说明了怎样定义并初始化一个字符串类型的弱引用实例[^2]。值得注意的是,由于弱引用不具备保持对象存活的能力,因此通常会配合`ReferenceQueue`一起使用,从而更好地管理这些即将消失的对象状态变化事件。 #### 主要差异对比 | 特征/属性 | 强引用 | 弱引用 | | --- | --- | --- | | 对象生命周期影响 | 阻碍垃圾回收;只有当所有强引用都被移除后才会考虑回收 | 不阻碍垃圾回收;每次GC都可能被清除 | | 创建方式 | `T t = new T();` 或者其他常规赋值表达式 | 使用`new WeakReference<>(referent)`构造函数 | | 应用场景 | 大多数情况下默认使用的引用模式 | 缓存数据结构、监听器列表等不需要长期存在的场合 | #### 实际应用案例分析 对于缓存设计而言,如果希望某些条目能够在必要时刻自动释放其所占用的空间而不必手动干预的话,那么采用弱引用来保存键值对就是一种合理的选择。因为每当发生GC动作的时候,那些仅由弱引用维持着联系的数据项将会自然地被淘汰出局,进而达到节省内存的目的[^3]。 另一方面,考虑到性能因素以及潜在的风险——即频繁发生的GC可能导致大量不必要的对象销毁活动——开发者应当谨慎评估具体需求后再决定是否引入此类特性到项目当中去[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值