我正在试图弄清楚如何在不知道对象类型的情况下对正在发送到函数的对象进行deinit / dealloc / nil。函数KillObject
的目的是简单地忽略发送的对象 - 因此它是从外部发送的对象应该为nil。
public class MyClass
{
init() { println("MyClass init") }
deinit { println("MyClass deinit") }
func sayHello() -> String { return "MyClass says Hello" }
}
var obj1:MyClass? = MyClass()
obj1?.sayHello()
public func KillObject(inout obj:AnyObject?)
{
obj = nil
}
var any:AnyObject? = obj1 as AnyObject?
KillObject(&any) // want `obj1`to be sent in
obj1 // is still an object, should be nil
any // is nil, correct
答案 0 :(得分:3)
这是你可以做到的一种方式。
public func KillObject<T>(inout obj:T?)
{
obj = nil
}
KillObject(&obj1)
答案 1 :(得分:1)
所以这就是这里:
您指向MyClass
obj1
的指针。然后,您创建指向obj1
指向的同一实例的另一个指针,并将其存储为any
。然后,将any
设置为nil,它将为零。但是您没有更改obj1
,它指向它设置为的MyClass
实例。
答案 2 :(得分:1)
对象类型必须符合NilLiteralConvertiable类型
public func KillObject(inout obj:NilLiteralConvertible) {
obj = nil
}
KillObject(&test)
答案 3 :(得分:1)
obj1指的是MyClass的一个对象。 obj1本身不是一个对象,而是对内存中对象的引用。
any,当指定obj1时,也引用与obj1引用的MyClass相同的对象。
当你为任何它指定nil时,它指的是nil,但是obj1仍然保存对仍然在内存中的原始对象的引用。将nil分配给any将不会使内存中的真实对象神奇地消失。
据我所知,Swift中的对象是引用计数。因此,如果仍然存在至少一个引用对象的变量,则不会对其进行解除分配。换句话说,在将所有引用的变量设置为nil或超出范围之前,对象不会从内存中释放。