【问题标题】:Swift : Some classes not de-initialised斯威夫特:一些类没有取消初始化
【发布时间】:2019-09-11 16:20:31
【问题描述】:

在以下代码中,NSStringNSNumber 在引用被删除时不会被取消初始化。 NSMutableStringNSAttributedString 被取消初始化。 deinit 的标准是什么?

class WeakHolder<R : AnyObject> {
    weak var cheez : R?
    init(_ _cheez : R) {
        cheez = _cheez
    }
}

do {
        var nsStringCollection = [NSString(string: "77"),NSString(string: "99")]
        let weakNSStringHolder = WeakHolder(nsStringCollection[1])
        nsStringCollection.removeLast()
        print("NSString : \(weakNSStringHolder.cheez)")
    }

    do {
        var nsMutableStringCollection = [NSMutableString(string: "77_m"),NSMutableString(string: "99_m")]
        let weakNSMutableStringHolder = WeakHolder(nsMutableStringCollection[1])
        nsMutableStringCollection.removeLast()
        print("NSMutableString : \(weakNSMutableStringHolder.cheez)")
    }

    do {
        var nsNumberCollection = [NSNumber(integerLiteral: 77),NSNumber(integerLiteral: 99)]
        let weakNumberHolder = WeakHolder(nsNumberCollection[1])
        nsNumberCollection.removeLast()
        print("Number : \(weakNumberHolder.cheez)")
    }

    do {
        var nsAttributedCollection = [NSAttributedString(string: "77_atts"),NSAttributedString(string: "99_atts")]
        let weakAttributedHolder = WeakHolder(nsAttributedCollection[1])
        nsAttributedCollection.removeLast()
        print("AttrString : \(weakAttributedHolder.cheez)")
    }

输出:

NSString : Optional(99)
NSMutableString : nil
Number : Optional(99)
AttrString : nil

【问题讨论】:

    标签: swift automatic-ref-counting deinit


    【解决方案1】:

    NSString 对象直接存储在它们的(标记的)指针中,不需要内存管理。其他静态字符串存储在二进制文件中,可能永远不会被释放。两者都不会分配内存,因此也不必释放它。

    NSMutableStringNSAttributedString 分配实际对象,因此它们也需要释放它们。

    这两种行为都是实现细节,您不应依赖它们。他们没有得到承诺。

    内存管理的规则是对你关心的任何事情都持有一个强引用,当你不再关心它时删除你的强引用。 deinit 应该只清理内存(例如,如果需要,在 malloc 块上调用 free)。 deinit 中不应包含“业务逻辑”;没有保证它会运行。 (例如,在正常程序终止期间,deinit 会被跳过,这与 C++ 不同。)

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      • 2017-03-24
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多