Swift : 一些 类 没有取消初始化
Swift : Some classes not de-initialised
在下面的代码中,当引用被移除时,NSString
和 NSNumber
不会被取消初始化。 NSMutableString
和 NSAttributedString
被取消初始化。 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
短 NSString
对象直接存储在它们的(标记的)指针中,不需要内存管理。其他静态字符串存储在二进制文件中,可能永远不会被释放。既不分配内存,也不释放内存。
NSMutableString
和 NSAttributedString
分配实际对象,因此它们也需要释放它们。
这两种行为都是实现细节,您不应依赖它们。他们没有承诺。
内存管理的规则是对你关心的任何东西持有一个强引用,当你不再关心它时删除你的强引用。 deinit
应该只清理内存(例如,如果需要,在 malloc 块上调用 free
)。没有 "business logic" 应该在 deinit
中;没有任何承诺会 运行。 (例如,在正常程序终止期间,deinit
被跳过,这与 C++ 不同。)
在下面的代码中,当引用被移除时,NSString
和 NSNumber
不会被取消初始化。 NSMutableString
和 NSAttributedString
被取消初始化。 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
短 NSString
对象直接存储在它们的(标记的)指针中,不需要内存管理。其他静态字符串存储在二进制文件中,可能永远不会被释放。既不分配内存,也不释放内存。
NSMutableString
和 NSAttributedString
分配实际对象,因此它们也需要释放它们。
这两种行为都是实现细节,您不应依赖它们。他们没有承诺。
内存管理的规则是对你关心的任何东西持有一个强引用,当你不再关心它时删除你的强引用。 deinit
应该只清理内存(例如,如果需要,在 malloc 块上调用 free
)。没有 "business logic" 应该在 deinit
中;没有任何承诺会 运行。 (例如,在正常程序终止期间,deinit
被跳过,这与 C++ 不同。)