Swift 之获取变量指针地址


print(Unmanaged.passUnretained(self.view).toOpaque())

Unmanaged 与 Objective-C 对象

由于 Objective-C 对象具有引用计数特性,单纯的指针可能无法满足使用需求,因此 Swift 引入了 Unmanaged 对象来管理引用计数。将一个对象声明为非托管有两个方法:

passRetained
passUnretained
如果这个非托管对象的使用全程,能够保障被封装对象一直存活,我们就可以使用 passUnretained 方法,对象的生命周期还归编译器管理。如果非托管对象使用周期超过了编译器认为的生命周期,比如超出作用域,编译器自动插入 release 的 ARC 语义,那么这个非托管对象就是一个野指针了,此时我们必须手动 retain 这个对象,也就是使用 passRetained 方法。一旦你手动 retain 了一个对象,就不要忘记 release 掉它,方法就是调用非托管对象的 release 方法,或者用 takeRetainedValue 取出封装的对象,并将其管理权交回 ARC。但注意,一定不要对一个用 passUnretained 构造的非托管对象调用 release 或者 takeRetainedValue,这会导致原来的对象被 release 掉,从而引发异常。

我们在自己的开发过程中基本也不会用到 Unmanaged 来管理对象生命周期和引用计数,但是如果要与 MRC 的库交互时,还是需要它的,Unmanaged 对象提供了转换为指针的方法。

你可能感兴趣的:(Swift 之获取变量指针地址)