保留 1.0.2

保留 1.0.2

Nayanda Haberty维护。



保留 1.0.2

  • 作者:
  • hainayanda

Retain

Retain是一个对象生命周期辅助工具,它提供了一种简单的方式来控制对象的保留并观察它

示例

要运行示例项目,克隆存储库,然后首先从Example目录运行pod install

要求

  • Swift 5.5或更高版本
  • iOS 13.0或更高版本
  • MacOS 10.15或更高版本
  • TVOS 13.0或更高版本
  • WatchOS 8.0或更高版本
  • XCode 13或更高版本

安装

Cocoapods

Retain可通过CocoaPods访问。要安装,请简单地将以下行添加到您的Podfile中:

pod 'Retain', '~> 1.0.2'

从XCode的Swift Package Manager添加

  • 使用XCode菜单文件 > Swift Package > 添加包依赖项
  • https://github.com/hainayanda/Retain.git作为Swift Package URL添加
  • 版本中设置规则,选择到下一个主版本选项,并将其版本设置为1.0.2
  • 点击下一步,等待

从Package.swift的Swift Package Manager添加

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

有一个名为 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 属性包装器

有一个名为 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

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