Retain是一个对象生命周期辅助工具,它提供了一种简单的方式来控制对象的保留并观察它
要运行示例项目,克隆存储库,然后首先从Example目录运行pod install
。
- Swift 5.5或更高版本
- iOS 13.0或更高版本
- MacOS 10.15或更高版本
- TVOS 13.0或更高版本
- WatchOS 8.0或更高版本
- XCode 13或更高版本
Retain可通过CocoaPods访问。要安装,请简单地将以下行添加到您的Podfile中:
pod 'Retain', '~> 1.0.2'
- 使用XCode菜单文件 > Swift Package > 添加包依赖项
- 将https://github.com/hainayanda/Retain.git作为Swift Package URL添加
- 在版本中设置规则,选择到下一个主版本选项,并将其版本设置为1.0.2
- 点击下一步,等待
在Package.swift中将它作为目标依赖项添加
dependencies: [
.package(url: "https://github.com/hainayanda/Retain.git", .upToNextMajor(from: "1.0.2"))
]
在您的目标中使用它作为Retain
.target(
name: "MyModule",
dependencies: ["Retain"]
)
hainayanda, [email protected]
Retain在MIT许可证下可用。有关更多信息,请参阅LICENSE文件。
您可以通过使用全局函数whenDeallocate(for:do:)
非常容易地观察对象释放
let cancellable = whenDeallocate(for: myObject) {
print("myObject is deallocated")
}
它将产生 Combine 的 AnyCancellable
,并且当对象被 ARC
销毁时,闭包将被调用。
如果你更愿意获取底层的发布者,请使用 deallocatePublisher(of:)
let myObjectDeallocationPublisher: AnyPublisher<Void, Never> = deallocatePublisher(of: myObject)
有一个名为 DeallocateObservable
的协议,可以将全局函数作为方法公开,从而可以直接从对象本身使用
class MyObject: DeallocateObservable {
...
...
}
然后你可以这样对对象做
// get the publisher
let myObjectDeallocationPublisher: AnyPublisher<Void, Never> = myObject.deallocatePublisher
// listen to the deallocation
let cancellable = myObject.whenDeallocate {
print("myObject is deallocated")
}
有一个名为 WeakSubject
的属性包装器,可以在不实现其名称的情况下启用 DeallocateObservable
的行为
@WeakSubject var myObject: MyObject?
这个属性包装器将在弱变量中存储对象,并且可以通过访问其 projectedValue
如同 DeallocateObservable
那样进行观察
// get the publisher
let deallocationPublisher: AnyPublisher<Void, Never> = $myObject.deallocatePublisher
// listen to the deallocation
let cancellable = $myObject.whenDeallocate {
print("current value in myObject propertyWrapper is deallocated")
}
只要对象仍然在这个 propertyWrapper
中被销毁,就会为分配给这个 propertyWrapper
的对象发送一个事件。
RetainableSubject
非常接近于 WeakSubject
。唯一的区别是,我们可以控制这个 propertyWrapper
是否将对象强保留或弱保留
@RetainableSubject var myObject: MyObject?
要更改 propertyWrapper
保留状态的状态,只需访问 projectedValue
// make weak
$myObject.state = .weak
$myObject.makeWeak()
// make strong
$myObject.state = .strong
$myObject.makeStrong()
由于 RetainableSubject
也是 DeallocateObservable
,你可以像对 WeakSubject
做的那样做类似的事情
// get the publisher
let deallocationPublisher: AnyPublisher<Void, Never> = $myObject.deallocatePublisher
// listen to the deallocation
let cancellable = $myObject.whenDeallocate {
print("current value in myObject propertyWrapper is deallocated")
}
你知道的,就是克隆然后发起一个 pull request