`
mrjeye
  • 浏览: 178009 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

强引用与弱引用探讨

 
阅读更多
保留一个对象创建了一个对该对象的“强”引用。一个对象只有在它的所有强引用都被释放后才能被回收。因此,一个对象的生命周期取决于其强引用的所有者。在某些情况下,这种行为可能并不理想。您可能想要引用一个对象而不妨碍对象本身的回收。对于这种情况,您可以获取一个“弱”引用。弱引用是通过存储一个指向对象的指针创建的,而不是保留对象。
    弱引用在可能会出现循环引用的情况下是必不可少的。例如,如果对象A和对象B互相通信,两者都需要引用对方。如果每个对象都保留对方对象,那么总有一个先release对方,假如A先release B,那么B就来不及releaseA,那么A就会闲置内存资源,造成浪费。所以弱引用在这里就大显身手了。为了打破这种循环,其中一个对象需要扮演从属角色,得到另一个对象的一个弱引用。举个具体的例子,在视图层次中,父视图拥有其子视图,也因此能够保留子视图,但父视图并不归子视图所有;然而子视图仍需要知道谁是它的父视图,因此它保持一个对其父视图的弱引用。
    Cocoa中弱引用的其他适用情况包括:表格数据源,大纲视图项,通知观察者以及其余项目标和委托,但不仅限于上述情况。
在向您弱引用的对象发送消息时,您需要小心谨慎。如果您在一个对象被回收之后向它发送消息,您的应用程序将会崩溃。您必须为对象何时有效制定有明确界定的条件。在大多数情况下,被弱引用的对象知道其他对象对它的弱引用,这和循环引用的情况是一样的,并且它还能够在自己被回收时通知其他对象。例如,当您向通知中心注册一个对象的时候,通知中心会存储一个对该对象的弱引用,并且在适当的消息发布时,还会向该对象发送消息。当对象被回收时,您需要向通知中心解注册该对象,以防通知中心向这个已经不存在的对象继续发送消息。同样,当一个委托对象被回收时,您需要通过向其他对象发送一条带nil参数的setDelegate:消息来删除委托链接。这些消息通常由对象的dealloc方法发出。



from:http://blog.sina.com.cn/s/blog_6ffab5d401010hex.html
分享到:
评论

相关推荐

    Android中的软引用和弱引用

    由于弱引用不会阻止垃圾收集,所以使用弱引用的对象在被创建后会很快变得不可达,除非有其他强引用指向它。这在一定程度上保证了内存的有效利用,避免了不必要的内存占用。 在Android中,软引用和弱引用常用于图片...

    强应用软引用弱引用与垃圾收集的关系1

    本文将深入探讨强引用、软引用、弱引用以及幻象引用这四种引用类型,以及它们与垃圾收集的关系。 1. **强引用(Strong Reference)**: - 强引用是Java中最常见的引用类型,它代表了一个对象的直接访问路径。只要...

    referenceInJava:Java强引用,软引用,弱引用以及虚引用测试项目

    这个"referenceInJava"项目专注于探讨四种不同类型的引用:强引用、软引用、弱引用和虚引用。这些引用类型与垃圾收集(Garbage Collection, GC)机制密切相关,对于优化内存使用和防止内存泄漏至关重要。 1. **强...

    Java中的软引用弱引用和虚引用.docx

    本文将深入探讨Java中三种特殊的引用类型——软引用(Soft Reference)、弱引用(Weak Reference)以及虚引用(Phantom Reference),并分析它们如何帮助我们更好地管理内存资源。 #### 二、基础知识回顾 在深入了解这三...

    强,软,弱,虚1

    本文将深入探讨四种引用类型:强引用、软引用、弱引用和虚引用。 首先,我们来理解强引用(Strong Reference)。强引用是最常见的引用类型,它代表了程序中的普通对象引用。当一个对象被强引用指向时,该对象被认为...

    十分钟理解Java中的弱引用编程开发技术共3页.pdf.z

    本文将深入探讨这一主题,帮助你在这十分钟内建立起对弱引用的理解。 首先,我们需要知道Java的内存区域分为堆内存和栈内存。其中,对象主要存储在堆内存中,而栈内存则用于存储基本类型和对象引用。当一个对象被...

    Java理论与实践:用弱引用堵住内存泄漏

    【Java理论与实践:用弱引用堵住内存泄漏】这篇文章除了介绍弱引用的概念,还探讨了如何使用弱引用来防止内存泄漏的问题。在Java编程中,内存泄漏并非像C++那样由忘记释放内存引起,而是由于对象生命周期与引用生命...

    swift-iOS基于消息转发机制实现弱引用计时器

    在本教程中,我们将探讨如何利用这个机制来实现一个基于弱引用的计时器,以避免内存泄漏的问题。首先,我们需要理解什么是消息转发,以及它在Swift中的工作原理。 **一、消息转发机制** 在Objective-C中,当对象...

    自动引用计数.playground.zip

    当对象的强引用计数归零时,即使还有弱引用存在,对象也会被销毁。 3. 无主引用(Unowned Reference):无主引用类似于弱引用,但假设引用的对象始终存在。无主引用不会增加引用计数,但在对象销毁后尝试访问无主...

    java 引用相关文档

    在这里,我们将详细讲解Java中的四种引用类型:强引用、软引用、弱引用和虚引用,以及它们在内存管理和垃圾收集中的作用。 1. **强引用(Strong Reference)** - 强引用是Java中最常见的引用类型,它是默认的引用...

    java引用的demo

    本示例“java引用的demo”将深入探讨四种不同类型的引用:强引用、软引用、弱引用和虚引用。这些引用类型对于理解和优化内存管理至关重要,特别是在Android开发中,因为良好的内存管理能够提升应用性能并防止内存...

    深入探讨 java.lang.ref 包1

    强引用的特点是,只要存在强引用,对象就不会被垃圾回收器回收,即使系统内存紧张。然而,过度依赖强引用可能会导致内存泄漏,因为无用的对象会一直占用内存。 接下来是软引用(SoftReference)。软引用是相对于强...

    Swift编程中用以管理内存的自动引用计数详解

    本文将深入探讨Swift中的自动引用计数以及与其相关的概念,如强引用、强引用循环、弱引用和无主引用。 首先,让我们理解什么是自动引用计数。当一个类的实例被创建时,ARC会在内存中为其分配空间,并在实例不再需要...

    ios-block循环引用的三种解决办法.zip

    这里,weakSelf是self的弱引用,当Block试图访问self时,会先将其转换为强引用strongSelf。如果self已经被释放,strongSelf会变为nil,防止Block继续引用self。 三、Block内部使用__unsafe_unretained 另一种方法是...

    基于软引用实现的缓存,当内存不够使会自动释放缓存内容,以避免OOM

    而弱引用则比软引用更弱,一旦弱引用的对象不再有强引用指向,即使内存空间足够,垃圾收集器也会回收该对象。软引用则是在系统即将发生内存溢出异常之前,才会被垃圾收集器回收。 在缓存设计中,使用软引用可以创建...

    Android JNI引用类型管理 (十)

    即使有弱全局引用指向一个对象,只要没有其他强引用,该对象仍然可以被垃圾收集。弱全局引用需要通过`DeleteWeakGlobalRef`来释放。在需要跟踪对象但又不想阻止其被垃圾回收的场景下,弱全局引用是非常有用的。 **...

    Java引用类型编程开发技术共13页.pdf.zip

    一旦没有任何强引用或软引用指向对象,即使是弱引用,该对象也会被立即回收。 8. 虚引用(Phantom Reference):虚引用并不直接与对象相关联,只在对象被垃圾收集后,通过虚引用可以知道对象已被回收。主要用于跟踪...

    深入剖析 Swift 中的自动引用计数(ARC)机制

    理解 ARC 的工作原理和正确使用强引用、弱引用和无主引用对于编写高效、稳定且可靠的 Swift 程序至关重要。通过避免循环引用和正确管理闭包中的引用,可以充分利用 ARC 的优势,确保应用程序的性能和稳定性。 在 ...

    《Ios组件与框架-iOS SDK 高级特性刨析》代码 全部之ARC部分

    弱引用与强引用** 在ARC中,有两种主要类型的引用:强引用(strong reference)和弱引用(weak reference)。强引用是默认的引用类型,保持对象的生命周期,直到没有其他强引用指向它。弱引用不增加对象的引用计数...

    Swift中的自动引用计数:释放内存的艺术

    - **强引用与弱引用**:强引用是指默认情况下属性和变量对对象的引用方式。这种引用会增加对象的引用计数。相反,弱引用通过使用`weak`关键字声明,不会增加对象的引用计数,常用于解决循环引用问题。 - **无主引用*...

Global site tag (gtag.js) - Google Analytics