Swift类实例与循环引用的解决

代码-情形1:

// 两个属性的值都允许为nil,这种场景最适合用弱引用来解决
class Person {
    let name: String
    init(name: String) {
        self.name = name
    }

    // 弱引用
    var apartment: Apartment?
    deinit {
        print("\(name) is being deinitialized")
    }
}

class Apartment {
    let number: Int

    init(number: Int) {
        self.number = number
    }

    // 弱引用
    weak var tenant: Person?

    deinit {
        print("Apartment #\(number) is being deinitialized")
    }
}

var John: Person? = Person(name: "John")
var Number73: Apartment? = Apartment(number: 73)

John!.apartment = Number73
Number73!.tenant = John

John = nil
Number73 = nil

代码-情形2:

// 一个属性的值允许为nil,而另一个属性的值不允许为nil,这种场景最适合通过无主引用来解决
class Customer {
    let name: String
    var card: CreditCard?
    init(name: String) {
        self.name = name
    }
    deinit {
        print("\(name) is being deinitialized")
    }
}

class CreditCard {
    let number: UInt64
    // 无主引用,不会对实例产生强引用
    unowned let customer: Customer
    init(number: UInt64, customer: Customer) {
        self.number = number
        self.customer = customer
    }
    deinit {
        print("Card #\(number) is being deinitialized")
    }
}

var john: Customer? = Customer(name: "John Appleseed")
john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)

john = nil

代码-情形3:

// 两个属性都必须有值,并且初始化完成后永远不会为nil
// 这种场景最适合通过一个类使用无主属性,而另外一个类使用隐式解析可选属性来解决
class Country {
    let name: String
    var capitalCity: City!
    init(name: String, capitalName: String) {
        self.name = name
        self.capitalCity = City(name: capitalName, country: self)
    }
    deinit {
        print("Country named \(name) is being deinitialized")
    }
}

class City {
    let name: String
    unowned let country: Country
    init(name: String, country: Country) {
        self.name = name
        self.country = country
    }
    deinit {
        print("City named \(name) is being deinitialized")
    }
}

var country: Country? = Country(name: "Canada", capitalName: "Ottawa")

country = nil
时间: 2024-11-05 16:39:24

Swift类实例与循环引用的解决的相关文章

IOS中解决ARC类实例间循环引用(Swfit)

原创Blog,转载请注明出处 http://blog.csdn.net/column/details/swfitexperience.html 备注:本文代码和图片主要来自于官方文档 不熟悉ARC的同学可以看看前一篇关于ARC的简述,这个是我的Swfit教程专栏 http://blog.csdn.net/column/details/swift-hwc.html 一.几个用到的关键概念 弱引用(weak):不会增加自动引用计数,必须为可选类型变量,因为弱引用在引用计数为0的时候,会自动赋为nil

swift中闭包的循环引用

首先我们先创造一个循环引用 var nameB:(()->())? override func viewDidLoad() { super.viewDidLoad() let bu = UIButton(type: .ContactAdd) bu.addTarget(self, action: "tap", forControlEvents: .TouchUpInside) view.addSubview(bu) run { print("name") sel

在mvc返回JSON时出错:序列化类型为“System.Data.Entity.DynamicProxies.Photos....这个会的对象时检测到循环引用 的解决办法

在MVC中返回JSON时出错,序列化类型为“System.Data.Entity.DynamicProxies.Photos....这个会的对象时检测到循环引用. public ActionResult GetSdirsbyFdirid(int id) { // db.Configuration.LazyLoadingEnabled = false; db.Configuration.ProxyCreationEnabled = false; List<Seconddirectory> lis

Block的使用及循环引用的解决

Block是一个很好用的东西,这篇文章主要来介绍:1.什么是Block?2.Block的使用?3.Block的循环引用问题及解决. 上面三点应该说是一个很大的问题,目前因为在做项目,我先仅就第三点做叙述,前两点等空闲的时候我再做补充. 1. 2. 3.Block的循环引用问题及解决. 首先我们需要明确的是,一个对象的Block属性是使用copy来修饰,当Block被copy时,会对block中用到的对象产生强引用(ARC)或者引用计数加一(MRC).当我们使用Block时,如果Block方法又引

JPA一对多循环引用的解决

说是解决,其实不是很完美的解决的,写出来只是想记录一下这个问题或者看一下有没有哪位仁兄会的,能否知道一二. 下面说说出现问题: 问题是这样的,当我查询一个一对多的实体的时候,工具直接就爆了,差不多我就猜到是哪里死循环了,最后等了好久,查看原因,果然是堆溢出,再然后是jsckson的错误.那么必然是序列化的问题了. 这是jackson的错误: at java.security.AccessController.doPrivileged(Native Method) at java.net.URLC

C#项目间循环引用的解决办法,有图有真相

程序间的互相调用接口,c#禁止互相引用,海宏软件,20160315 /// c#禁止互相引用,如果项目[订单]中有一个orderEdit单元,要在项目[进销存]中不能直接引用,所以定义这一标准接口. /// 1:定义标准接口在公共单元中. /// 2:在主程序中引用订单和进销存单元. /// 3:主程序中重写接口的虚方法,调用[订单]项目的功能 /// 4:主程序启动时,创建调用实例,把变量写到公共静态变量 /// 5:进销存项目通过公共变量调用 比较简单就解决了.

动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法 (转)

本文转自:http://blog.csdn.net/limlimlim/article/details/8647038 [导读]ServiceDescriptionImporter是创建Web Service 时使用的类,它是引用继承System.Web.Services 当我将VS2005里写的一段代码放在VS2010里时,发现引用出现错误标志.代码如下: '// 3. 创建客户端代理代理类. ServiceDescriptionImporter importer = new ServiceD

EF中Json序列化对象时检测到循环引用的解决办法

第一种方法:使用Newtonsoft.Json中的方法注释,在Json序列化的时候忽略导航属性 例:using Newtonsoft.Json; public class Users { public int Id { get; set; } public string LoginId { get; set; } public string LoginPwd { get; set; } [JsonIgnore] public virtual ICollection Roles { get; se

使用gc、objgraph干掉python内存泄露与循环引用!

Python使用引用计数和垃圾回收来做内存管理,前面也写过一遍文章<Python内存优化>,介绍了在python中,如何profile内存使用情况,并做出相应的优化.本文介绍两个更致命的问题:内存泄露与循环引用.内存泄露是让所有程序员都闻风丧胆的问题,轻则导致程序运行速度减慢,重则导致程序崩溃:而循环引用是使用了引用计数的数据结构.编程语言都需要解决的问题.本文揭晓这两个问题在python语言中是如何存在的,然后试图利用gc模块和objgraph来解决这两个问题. 注意:本文的目标是Cpyth