美文网首页
Swift 版本的对象临终遗言

Swift 版本的对象临终遗言

作者: BudSwift | 来源:发表于2018-11-17 12:14 被阅读3次

如果需要在某个对象释放时执行特定的任务,比如移除通知、观察者的监听。除了手动在 deinit 中处理外,可以使用运行时的 objc_assocatio 和 closure 对这一需求进行封装。

封装 closure 执行对象

将 deinit 时需要执行的 closure 封装为一个对象,此对象将在 deinit 时调用 closure

enum XDeinit { // 嵌套类型
    class BlockExecutor {
        var block: (()->Void)?
        init(_ block: (()->Void)?) { self.block = block }
        deinit {
            if let block = block { block() }
        }
    }
}

通过 extension 提供遗言功能

提供给 NSObject 子类可以留下最终消息的操作方法,并在内部进行对象组装,以及属性关联

extension NSObject {
    static var LastWordsKey: Any? = nil // 类属性作为 key 值使用
    func leave(with lastWords: (()->Void)?) {
        let ex = XDeinit.BlockExecutor(lastWords)
        objc_setAssociatedObject(self, &NSObject.LastWordsKey, ex, .OBJC_ASSOCIATION_RETAIN)
    }
}

如此以来,包装的 BlockExcutor B 被对象 A 强引用,当 A 释放时,B 随之也释放,进而调用了 B 的 deinit 中的 closure。
可以使用如下代码在 SwiftPlayground 中进行测试。

var obj: NSObject? = nil
obj = NSObject()
obj?.leave { print("be good.") }
obj = nil

项目地址

GitHub

加我微信沟通。


相关文章

  • Swift 版本的对象临终遗言

    如果需要在某个对象释放时执行特定的任务,比如移除通知、观察者的监听。除了手动在 deinit 中处理外,可以使用运...

  • 临终遗言

    漆黑色的烟 衬托着幽深冷寂的夜 曾经澄澈的眼 如今却被血丝布满 憎恨 总是在我身边 憎恨 总是让我泪流满面 憎恨 ...

  • 临终遗言

    这是一场意外的相逢 我试图从梦中清醒 将你留在我心上的泪水擦拭干净 然后 给夜色里的幽灵 唱一曲自编的歌曲 以求它...

  • 临终遗言

    一个重病的病人躺在病床上,带着氧气面罩,周身插着管子,突然间病人开始抽搐,同时嘴也蠕动着似乎有话要说。 站在旁边的...

  • 临终遗言

    一个重病的病人躺在病床上,带着氧气面罩,周身插着管子,突然间病人开始抽搐,同时嘴也蠕动着似乎有话要说。 站在旁边的...

  • 临终遗言

    天空是一面镜子 我用目光搜寻 为何天空,空空如也 我听大海的波涛声 在那浪花之间 仍未寻到旧物的蛛丝马迹 在那些晴...

  • 临终遗言

    如果真有这样一天 我变成了这样的人 无魂无魄,无心无眼 那么 请在初春的时候 让我在一朵朵紫薇花下死去 将我的骨灰...

  • 读《孔子临终遗言》有感

    今天,偶遇了《孔子临终遗言》,读来很有感觉。 《孔子临终遗言》是大成至圣先师孔子临终前对弟子们说的肺腑之言,教导学...

  • 古人的遗言

    时下,世人临终遗言,大多是交待财产。而有些古人的临终遗言却与众不同,他们的遗言是教育子孙要作一个什么样的人。教导子...

  • 孔子另有真面目?真相是这样!

    有朋友转来一篇“孔子临终遗言出土”的消息求证真伪。粗读之下很是吃惊,因为这个“临终遗言”折射了一个与我们印象中完全...

网友评论

      本文标题:Swift 版本的对象临终遗言

      本文链接:https://www.haomeiwen.com/subject/upvbfqtx.html