reference cycle 引用循环

本文介绍Swift中循环引用的两种常见情况及解决方案。一种是类之间的循环引用,通过使用weak关键字来解决;另一种是闭包引起的循环引用,可以利用unowned关键字解决。文中还提供了具体的代码示例。

在swift 里引用循环的造成,主要有两个方法,

1.类之间的引用

2.clourse 闭包引用

解决办法:

weak references and unowned references. 也就是weak,unowned

weak, 来修饰可选的,? 结尾的,如:var weak city: String ?

unowned 来修身 一直存在的。 var unowned city: String

  • class Person {
    	letname: String
    	init(name:String) { self.name =name }
    	var apartment: Apartment?
    	deinit { println("\(name) is being deinitialized") }
    }
    class Apartment {
    	letnumber: Int
    	init(number:Int) { self.number =number }
    	weak var tenant: Person?
    	deinit { println("Apartment #\(number) is being deinitialized") }
    }
    weak 避免循环引用的例子
  • class Customer {
    	letname: String
    	var card: CreditCard?
    	init(name:String) {
    	self.name = name
    	}
    	deinit { println("\(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 { println("Card #\(number) is being deinitialized") }
    }


以上 unowned 避免循环引用的例子

  • lazyvar someClosure: (Int,String) -> String = {
    [unownedself, weak delegate = self.delegate!] (index:Int, stringToProcess: String) -> String in
    // closure body goes here
    }
clourse 中避免循环引用的例子


详情请看apple swift 文档



### iOS 开发中循环引用的解决方法 在 iOS 开发中,**循环引用(retain cycle)** 是指两个或多个对象之间相互持有强引用,导致内存无法释放的问题。这通常发生在使用 Objective-C 的 `strong` 引用或者 Swift 中的 `strong` 或 `retain` 语义时。 #### 使用弱引用打破循环 一种常见的解决方案是使用 **弱引用(weak reference)** 来打破对象之间的强引用链条。例如,在定义属性时可以将其中一个对象的引用设置为 `weak`,从而防止形成循环引用[^2]。 ```objective-c @interface FirstPerson : NSObject @property (nonatomic, weak) SecondPerson *test; // 使用 weak 避免循环引用 @end @interface SecondPerson : NSObject @property (nonatomic, strong) FirstPerson *test; @end ``` #### 在 Block 中避免循环引用 当涉及到 block 捕获 self 时,可以通过创建一个指向 self 的弱引用来打破潜在的循环引用关系: ```objective-c __weak typeof(self) weakSelf = self; self.completionBlock = ^{ __strong typeof(weakSelf) strongSelf = weakSelf; if (strongSelf) { // 安全地访问 strongSelf } }; ``` 这种方式确保了即使 block 被保留,也不会造成 self 被永久保留在内存中[^3]。 #### Delegate 模式中的弱引用 对于 delegate 设计模式,通常建议将 delegate 属性声明为 `weak` 以避免形成从被委托方到委托方的强引用路径。这样设计可以有效阻止可能出现的循环引用问题[^2]。 #### 定时器与目标对象的关系 针对 NSTimer 这样的定时器机制,需要注意它对其目标对象持有的是强引用。因此,在实现 timer 相关逻辑时,开发者应当手动管理好相关对象的生命期,必要时主动使 timer 失效来解除这种强绑定关系[^1]。 #### 内存泄漏检测工具 除了编码时采取预防措施外,还可以利用 Xcode 提供的各种调试工具如 Instruments 中的 Leaks 工具来识别和定位应用程序中存在的内存泄漏问题。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值