是否有任何方式来模拟[NSString stringWithFormat:@“%p”,myVar],从Objective-C,在新的Swift语言?

例如:

let str = "A String"
println(" str value \(str) has address: ?")

当前回答

注意:这是针对引用类型的。

斯威夫特:4/5

print(Unmanaged.passUnretained(someVar).toOpaque())

打印someVar的内存地址。 (感谢@Ying)


斯威夫特3.1:

print(Unmanaged<AnyObject>.passUnretained(someVar as AnyObject).toOpaque())

打印someVar的内存地址。


其他回答

获取一个对象的(堆)地址

func address<T: AnyObject>(o: T) -> Int {
    return unsafeBitCast(o, Int.self)
}

class Test {}
var o = Test()
println(NSString(format: "%p", address(o))) // -> 0x7fd5c8700970

(编辑:Swift 1.2现在包含了一个类似的叫做unsafeAddressOf的函数。)

在Objective-C中,这将是[NSString stringWithFormat:@"%p", o]。

O是对实例的引用。因此,如果o被赋值给另一个变量o2, o2的返回地址将是相同的。

这并不适用于结构体(包括String)和基本类型(如Int),因为它们直接存在于堆栈上。但我们可以检索堆栈上的位置。

获取结构、内置类型或对象引用的(堆栈)地址

func address(o: UnsafePointer<Void>) -> Int {
    return unsafeBitCast(o, Int.self)
}

println(NSString(format: "%p", address(&o))) // -> 0x10de02ce0

var s = "A String"
println(NSString(format: "%p", address(&s))) // -> 0x10de02ce8

var i = 55
println(NSString(format: "%p", address(&i))) // -> 0x10de02d00

在Objective-C中,这将是[NSString stringWithFormat:@"%p", &o]或[NSString stringWithFormat:@"%p", &i]。

S是结构。因此,如果s被赋值给另一个变量s2,值将被复制,s2的返回地址将不同。

它是如何组合在一起的(指针概述)

像在Objective-C中一样,有两个不同的地址与o相关。第一个是对象的位置,第二个是对象的引用(或指针)的位置。

是的,这意味着地址0x7fff5fbfe658的内容是数字0x6100000011d0,调试器可以告诉我们:

(lldb) x/g 0x7fff5fbfe658
0x7fff5fbfe658: 0x00006100000011d0

除了字符串是结构体,在内部这和(Objective-)C的工作原理是一样的。

(目前为Xcode 6.3)

我对Swift 3的解决方案

extension MyClass: CustomStringConvertible {
    var description: String {
        return "<\(type(of: self)): 0x\(String(unsafeBitCast(self, to: Int.self), radix: 16, uppercase: false))>"
    }
}

这段代码创建的描述类似于默认描述 < MyClass: 0 x610000223340 >

斯威夫特5

extension String {
    static func pointer(_ object: AnyObject?) -> String {
        guard let object = object else { return "nil" }
        let opaque: UnsafeMutableRawPointer = Unmanaged.passUnretained(object).toOpaque()
        return String(describing: opaque)
    }
}

用法:

print("FileManager.default: \(String.pointer(FileManager.default))")
// FileManager.default: 0x00007fff5c287698

print("nil: \(String.pointer(nil))")
// nil: nil

在Swift4 about Array中:

    let array1 = [1,2,3]
    let array2 = array1
    array1.withUnsafeBufferPointer { (point) in
        print(point) // UnsafeBufferPointer(start: 0x00006000004681e0, count: 3)
    }
    array2.withUnsafeBufferPointer { (point) in
        print(point) // UnsafeBufferPointer(start: 0x00006000004681e0, count: 3)
    }

就用这个吧:

print(String(format: "%p", object))