Swift:有些类没有去初始化

问题描述 投票:-2回答:1

在以下代码中,当删除引用时,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个回答
1
投票

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

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

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

内存管理规则是对您关心的任何内容进行强有力的引用,并在您不再关心时删除强引用。 deinit应该只清理内存(例如,如果需要,在malloc-blocks上调用free)。没有“商业逻辑”应该在deinit;它永远不会有任何承诺。 (例如,在正常程序终止期间,跳过deinit,与C ++不同。)

© www.soinside.com 2019 - 2024. All rights reserved.