可変メモリアドレスをすばやく印刷する
Printing Variable Memory Address Swift
解決:
注:これは参照型用です。
Swift 4/5:
print(Unmanaged.passUnretained(someVar).toOpaque())someVarのメモリアドレスを出力します。 (@Yingに感謝)
Swift 3.1:
print(Unmanaged.passUnretained(someVar as AnyObject).toOpaque())someVarのメモリアドレスを出力します。
スイフト2
これは現在、標準ライブラリの一部です。unsafeAddressOf。
/// UnsafePointerを `object`に使用されるストレージに返します。 ///オブジェクトを識別するために使用する以外に、これでできることはあまりありません///スウィフト3
Swift 3の場合は、withUnsafePointer:
var str = '文字列' withUnsafePointer(to:&str){print( 'str value (str)has address:($ 0)')}
この答えはかなり古いことに注意してください。それが説明する方法の多くはもはや機能しません。具体的には.coreにアクセスできなくなりました。
ただし、@ drewの答えは正しく単純です。
これは現在、標準ライブラリunsafeAddressOfの一部です。
したがって、あなたの質問に対する答えは次のとおりです。
println( 'str value (str)has address:(unsafeAddressOf(str))')
正解とマークされた元の回答は次のとおりです(後世/礼儀正しさのために):
Swiftは 'ポインタを'非表示にしますが、それらはまだ内部に存在します。 (ランタイムがそれを必要とし、ObjcおよびCとの互換性の理由から)
知っておくべきことはほとんどありませんが、最初にSwift文字列のメモリアドレスを出力する方法は?
var aString:String = 'これは文字列です' NSLog( '%p'、aString.core._baseAddress)// _ baseAddressはCOpaquePointerです//出力アドレスの例0x100006db0これにより、文字列のメモリアドレスが出力されます。XCode-> Debug Workflow-> View Memoryを開き、出力されたアドレスに移動すると、文字列の生データが表示されます。これは文字列リテラルであるため、これはバイナリのストレージ内のメモリアドレスです(スタックやヒープではありません)。
ただし、そうする場合
var aString:String = 'これは文字列です' + 'これは別の文字列です' NSLog( '%p'、aString.core._baseAddress)//出力アドレスの例0x103f30020文字列は実行時に作成されるため、これはスタックにあります
注:.core._baseAddressは文書化されていません。変数インスペクターで調べたところ、将来非表示になる可能性があります。
_baseAddressは、すべてのタイプで使用できるわけではありません。ここでは、CIntを使用した別の例です。
var testNumber:CInt = 289 TakesInt(&testNumber)どこTakesIntはこのようなCヘルパー関数です
void TakesInt(int * intptr){printf( '%p'、intptr); }Swift側では、この関数はTakesInt(intptr:CMutablePointer)なので、CMutablePointerをCIntに取得し、&varnameで取得できます。
関数は印刷します0x7fff5fbfed98、このメモリアドレスには289(16進表記)があります。あなたはその内容を変更することができます* intptr = 123456
さて、知っておくべき他のいくつかのこと。
文字列は、迅速に、オブジェクトではなくプリミティブ型です。
CIntは、Cint型にマップされたSwift型です。
オブジェクトのメモリアドレスが必要な場合は、別のことを行う必要があります。
Swiftには、Cと対話するときに使用できるいくつかのポインター型があり、ここでそれらについて読むことができます:Swiftポインター型
さらに、それらの宣言(cmd +型をクリック)を調べて、ポインターの型を別の型に変換する方法を理解することができます。
var aString:NSString = 'これは文字列です' // NSStringを作成しますvaranUnmanaged = Unmanaged.passUnretained(aString)//アンマネージポインターを取得しますvaropaque:COpaquePointer = anUnmanaged.toOpaque()// COpaquePointerに変換しますvarmut :CMutablePointer =&opaque //これはCMutablePointerですprintptr(mut)// Cで記述されたヘルパー関数へのポインターを渡しますprintptrは、この実装で作成したCヘルパー関数です。
void printptr(void ** ptr){printf( '%p'、* ptr); }繰り返しますが、印刷された住所の例は次のとおりです。0x6000000530b0、そしてメモリインスペクターを通過すると、NSStringが見つかります
Swiftのポインターでできることの1つ(これはinoutパラメーターでも実行できます)
func playWithPointer(stringa:AutoreleasingUnsafePointer){stringa.memory = '文字列が更新されました'; } var testString:NSString = 'テスト文字列' println(testString)playWithPointer(&testString)println(testString)または、Objc / cとのやり取り
// objc side +(void)writeString:(void **)var {NSMutableString * aString = [[NSMutableString alloc] initWithFormat:@ 'pippo%@'、@ 'pluto']; * var =(void *)CFBridgingRetain(aString); // 保持! } //迅速な側面varopaque = COpaquePointer.null()// nullを指す新しい不透明なポインターを作成しますTestClass.writeString(&opaque)var string = Unmanaged.fromOpaque(opaque).takeRetainedValue()println(string)//これは出力しますピッポプルト