在新的Swift语言中,是否有任何方式可以模拟Objective-C中的[NSString stringWithFormat:@"%p", myVar]
?
例如:
let str = "A String"
println(" str value \(str) has address: ?")
在新的Swift语言中,是否有任何方式可以模拟Objective-C中的[NSString stringWithFormat:@"%p", myVar]
?
例如:
let str = "A String"
println(" str value \(str) has address: ?")
&
触发的),Swift无法确保它以这种方式运行。如果您改为使用第一种方法,则会自动将Array
转换为NSArray
,这显然不是我们想要的。frame variable -L yourVariableName
。func address(o: UnsafePointer<Void>) {
let addr = unsafeBitCast(o, Int.self)
print(NSString(format: "%p", addr))
}
func address<T: AnyObject>(o: T) -> String{
let addr = unsafeBitCast(o, Int.self)
return NSString(format: "%p", addr) as String
}
let ptr = unsafeAddressOf(obj)
let nullPtr = UnsafePointer<Void>(bitPattern: 0)
/// This gets the address of pointer
let address = nullPtr.distanceTo(ptr) // This is Int
稍作跟进。
我在Swift 3上的解决方案
extension MyClass: CustomStringConvertible {
var description: String {
return "<\(type(of: self)): 0x\(String(unsafeBitCast(self, to: Int.self), radix: 16, uppercase: false))>"
}
}
<MyClass: 0x610000223340>
。这是针对Swift 3的。
和@CharlieMonroe一样,我想要将地址作为整数获取。具体来说,我想要获取一个Thread对象的地址,用作诊断日志模块中的线程ID,在没有线程名称可用的情况下。
基于Charlie Monroe的代码,这是我目前想出的东西。但请注意,我非常新手Swift,可能不正确...
// Convert the memory address of the current Thread object into an Int for use as a thread ID
let objPtr = Unmanaged.passUnretained(Thread.current).toOpaque()
let onePtr = UnsafeMutableRawPointer(bitPattern: 1)! // 1 used instead of 0 to avoid crash
let rawAddress : Int64 = onePtr.distance(to: objPtr) + 1 // This may include some high-order bits
let address = rawAddress % (256 * 1024 * 1024 * 1024) // Remove high-order bits
最后一条语句是必需的,因为如果没有它,我会得到像0x60000007DB3F这样的地址。最后一条语句中的模运算将其转换为0x7DB3F。
这绝对不是最快或最安全的方法。但对我来说有效。这将允许任何NSObject子类采用此属性。
public extension NSObject {
public var memoryAddress : String? {
let str = "\(self.self)".components(separatedBy: ": ")
guard str.count > 1 else { return nil }
return str[1].replacingOccurrences(of: ">", with: "")
}
}
//usage
let foo : String! = "hello"
Swift.print(foo.memoryAddress) // prints 0x100f12980
[NSString stringWithFormat:@"%p", myVar]
中,myVar
必须是一个指针。在您的 Swift 代码中,str
不是一个指针,因此该比较不适用。 - user102008